Java 如何读入数字1-6的列表并计算重复的数字
因此,我试图从一个文件中读取,该文件中有超过10000000个数字,范围从1到6。本质上,这个练习的目的是模拟掷骰子,我需要找到每个数字被掷的概率。我编写了将随机数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
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非常同意