Java 如何读入数字1-6的列表并计算重复的数字

Java 如何读入数字1-6的列表并计算重复的数字,java,simulation,dice,Java,Simulation,Dice,因此,我试图从一个文件中读取,该文件中有超过10000000个数字,范围从1到6。本质上,这个练习的目的是模拟掷骰子,我需要找到每个数字被掷的概率。我编写了将随机数1-6写入文件的代码,该文件是: public static void main(String[]args)throws IOException{ Scanner kb = new Scanner(System.in); PrintWriter pw = new PrintWriter(new File("R

因此,我试图从一个文件中读取,该文件中有超过10000000个数字,范围从1到6。本质上,这个练习的目的是模拟掷骰子,我需要找到每个数字被掷的概率。我编写了将随机数1-6写入文件的代码,该文件是:

public static void main(String[]args)throws IOException{
    Scanner kb = new Scanner(System.in);
    PrintWriter pw = new PrintWriter(new File("Rolls.txt"));
    System.out.println("Input a number for the amount of rolls");

    long rolls = kb.nextLong();

    for(int i = 0; i< rolls; i++){
        
        if(i % 20 == 0){
            pw.println();
        }
        else{
        pw.print(((int)(Math.random()*6)+1) + ",");
        }
    }


   
    pw.close();
}

感谢您的帮助。谢谢

因为你所接受的东西都是整数,所以你可以用它们作为键

public static void main(String[]args) throws IOException {
    Scanner in = new Scanner(new File("Rolls.txt"));
    long[] list = {0,0,0,0,0,0};
    int parsed;

    while ( in.hasNextLine()){
        String line = in.nextLine();
        String[] numbers = line.split(",");

        for (String number : numbers) {
            parsed = Integer.parseInt(number);
            list[parsed - 1]++;
        }
    }

**我还没有测试过这个,但它应该可以工作,因为你正在接受的东西都是整数,你可能会用它们作为键

public static void main(String[]args) throws IOException {
    Scanner in = new Scanner(new File("Rolls.txt"));
    long[] list = {0,0,0,0,0,0};
    int parsed;

    while ( in.hasNextLine()){
        String line = in.nextLine();
        String[] numbers = line.split(",");

        for (String number : numbers) {
            parsed = Integer.parseInt(number);
            list[parsed - 1]++;
        }
    }

**我没有对此进行测试,但它应该可以工作

您用来生成转鼓的代码做得不太好。它在文件的开头放了一个空的新行,因为我在循环的第一次迭代中等于0。第二个问题是,生成的卷的数量少于您想要的数量,因为在某些迭代中,您只写了一行,而没有写任何数字。这就是我修改代码以正确生成转鼓的方式

public static void main(String[]args)throws IOException{
    Scanner kb = new Scanner(System.in);
    PrintWriter pw = new PrintWriter(new File("Rolls.txt"));
    System.out.println("Input a number for the amount of rolls");

    long rolls = kb.nextLong();

    for(int i = 1; i<= rolls; i++){

        if(i % 20 == 0){
            pw.println();
        }
        pw.print(((int)(Math.random()*6)+1) + ",");
    }



    pw.close();
}
现在,这里是阅读和计算概率代码的继续部分。正如一些人已经评论过的那样,您应该使用Integer.parseInt;以整数形式获取字符串值

        public static void main(String[]args) throws IOException{
                Scanner in = new Scanner(new File("Rolls.txt"));
                long[] list = {0,0,0,0,0,0};
                while ( in.hasNextLine()){
                        String line = in.nextLine();
                        String[] numbers = line.split(",");
                        //parse the string to ints
                        for(int i=0;i<numbers.length;i++){
                                int currentValue = Integer.parseInt(numbers[i]);
                                list[currentValue-1]++;
                        }
                }
                long totalRollCount=0;
                for(int i=0;i<list.length;i++){
                        totalRollCount+=list[i];
                }
                System.out.println(totalRollCount);
                for(int i=0;i<list.length;i++){
                        System.out.println((i+1)+" "+((double)list[i]/totalRollCount));
                }
    }

您用来生成卷的代码做得不是很好。它在文件的开头放了一个空的新行,因为我在循环的第一次迭代中等于0。第二个问题是,生成的卷的数量少于您想要的数量,因为在某些迭代中,您只写了一行,而没有写任何数字。这就是我修改代码以正确生成转鼓的方式

public static void main(String[]args)throws IOException{
    Scanner kb = new Scanner(System.in);
    PrintWriter pw = new PrintWriter(new File("Rolls.txt"));
    System.out.println("Input a number for the amount of rolls");

    long rolls = kb.nextLong();

    for(int i = 1; i<= rolls; i++){

        if(i % 20 == 0){
            pw.println();
        }
        pw.print(((int)(Math.random()*6)+1) + ",");
    }



    pw.close();
}
现在,这里是阅读和计算概率代码的继续部分。正如一些人已经评论过的那样,您应该使用Integer.parseInt;以整数形式获取字符串值

        public static void main(String[]args) throws IOException{
                Scanner in = new Scanner(new File("Rolls.txt"));
                long[] list = {0,0,0,0,0,0};
                while ( in.hasNextLine()){
                        String line = in.nextLine();
                        String[] numbers = line.split(",");
                        //parse the string to ints
                        for(int i=0;i<numbers.length;i++){
                                int currentValue = Integer.parseInt(numbers[i]);
                                list[currentValue-1]++;
                        }
                }
                long totalRollCount=0;
                for(int i=0;i<list.length;i++){
                        totalRollCount+=list[i];
                }
                System.out.println(totalRollCount);
                for(int i=0;i<list.length;i++){
                        System.out.println((i+1)+" "+((double)list[i]/totalRollCount));
                }
    }

Kamen Vakavchiev和Alexandre Hassan的答案是好的,但我希望支持另一种方法,即使用Java8流API使代码更加简单易读

BufferedReader reader = new BufferedReader(new FileReader("Rolls.txt"));
Map<String, Long> result = reader.lines()
    .flatMap((Function<String, Stream<String>>) s -> Arrays.stream(s.split(",")))
    .collect(Collectors.groupingBy(s -> s, Collectors.summingLong(value -> 1)));
System.out.println(result);

Kamen Vakavchiev和Alexandre Hassan的答案是好的,但我希望支持另一种方法,即使用Java8流API使代码更加简单易读

BufferedReader reader = new BufferedReader(new FileReader("Rolls.txt"));
Map<String, Long> result = reader.lines()
    .flatMap((Function<String, Stream<String>>) s -> Arrays.stream(s.split(",")))
    .collect(Collectors.groupingBy(s -> s, Collectors.summingLong(value -> 1)));
System.out.println(result);

您需要迭代数字中的项目,将每个项目从字符串转换为整数。请参见integer.parseInt,然后在第行的相应索引处增加项目,即第[roll]++。您遇到了什么具体问题?您尝试了什么以及它是如何不起作用的?我尝试了一些东西,但不起作用不是一个起作用的问题描述。您需要迭代数字中的项目,将每个项目从字符串转换为整数。请参阅integer.parseInt,然后在第行的相应索引处增加项目,即第[roll]++行。您有什么确切的问题?你尝试了什么以及它是如何不起作用的?我尝试了一些东西,但不起作用不是一个工作问题描述。当我尝试运行这个时,我得到了一个大错误。我在主线程中得到:异常。我做错什么了吗?或者这不起作用?当我试着运行它时,我得到了一个大错误。我在主线程中得到:异常。我做错什么了吗?或者这不起作用?或者Map freq=reader.lines.flatMapline->Arrays.streamline.split、.collectCollectors.groupingBystr->str、Collectors.counting;但是我怀疑OP是Java的新手,应该首先关注基础知识。@WJS very agreeor Map freq=reader.lines.flatMapline->Arrays.stream.split、.collectCollectors.groupingBystr->str,Collectors.counting;但我怀疑OP是Java的新手,应该首先关注基础知识。@WJS非常同意