gpt4 book ai didi

java - 二维数组或文件中线的处理范围

转载 作者:行者123 更新时间:2023-12-01 10:03:13 26 4
gpt4 key购买 nike

我是编程新手。我正在独自学习,而我正在使用的书中的示例太简单了,因此我试图做一些更难的事情。彩票是我的爱好之一,我认为选择的问题将使我更容易学习Java。

该程序在一种彩票类型的基诺彩票中计算频率(从1 t0 70开始,每个数字出现在我的txt文件中的次数)(在基诺彩票中,抽奖包括70个数字中的20个数字,而不是49个数字中的6个数字) 。

我不想计算整个txt文件的频率,而只想计算一部分频率,例如,如果文件有x行,我只想x-5和x-10之间的行,就像这样。我不知道文件中的行数,也许是几千,但它始终有20列。

该程序对于整个文件都可以正常工作,但是在尝试仅处理其中一部分时遇到麻烦。我认为我应该将文件读入二维数组,然后才能处理所需的行。我很难将每一行都转换成矩阵。我读过每一篇关于将文件读入2d数组的文章,但无法使其正常工作。

以下是我一个多星期的尝试之一

public static void main(String args[]) {

int[][] matricea = new int [30][40];
int x=0, y=0;

try {
BufferedReader reader = new BufferedReader(
new FileReader("C:\\keno.txt")
);

int[] numbers = new int[72]; //each keno draw has 70 numbers

for (int i = 0; i < 71; i++ ){
numbers[i] = 0;
}

int k=0; // k counts the lines
String draw;

while ( (draw = reader.readLine()) != null ) {

String[] pieces = draw.split(" +");
k++;

for (String str : pieces) {
int str_int = Integer.parseInt(str);
matricea[x][y] = str_int;
System.out.print(matricea [x][y] + " ");
y = y + 1;
}

x = x + 1;
System.out.println(" ");
}

for (int j = 1; j <= 20; j++) {
int drawnNumber = Integer.parseInt(pieces[j]);
numbers[drawnNumber]++;
}

System.out.println(" nr. of lines is " + k);
reader.close();

for (int i = 0; i < 71; i++) {
System.out.println(i + ": " + numbers[i]);
}

} catch (Exception e) {
System.out.println("There was a problem opening and processing the file.");
}

}

最佳答案

格式化和改进当前代码

我将展示如何解决您的问题,但是首先,我想指出您代码中的一些事情,可以通过一些格式化来改善它们,或者可能是不必要的。

只是为了帮助您提高编码技能,可读性非常重要! :)

而且不要忘记,一致性是关键!如果您喜欢一种样式而不是更普遍的样式或首选样式,那很好,只要在整个编码过程中都使用它即可。不要在两种样式之间切换。

如果您不愿意阅读这些评论,可以在我的答案底部找到解决方案。请注意,您的原始代码在我的解决方案中将有所不同,因为我已将其格式化为对我而言最易读的格式。



变量声明中的间距

原始码

int[][] matricea = new int [30][40];
int x=0, y=0;


间距已修改

int[][] matricea = new int[30][40];
int x = 0, y = 0;


请注意在 int[30][40]之间删除了空格,并在变量和初始化之间添加了空格,即- x=0 => x = 0



初始化一个int数组以包含全0

原始码

int[] numbers = new int[72];  //each keno draw has 70 numbers

for (int i = 0; i < 71; i++ ){
numbers[i] = 0;
}


如同

int[] numbers = new int[72];  //each keno draw has 70 numbers


您不必将每个值都设置为 0,Java会为您完成。实际上,Java对于所有类型都具有默认值或空值。感谢Debosmit Ray!

对于这种情况,无论何时,为什么或如何,我都不会例外,您可以在 this post中阅读该内容,并密切关注Aniket Thakur的回答。

但是,如果只有70种可能性,为什么还要有72个大小的数组?



选择变量名

原始码

int k=0;     // k counts the lines


如同

int numLines = 0;


您应该始终使变量名称对它们的用途有意义。如果必须使用 k counts the lines之类的注释来描述变量的用途,请考虑是否可以使用更好的名称。



功能化代码

原始码

 while ( (draw = reader.readLine()) != null ) { 

String[] pieces = draw.split(" +");
k++;

for (String str : pieces) {
int str_int = Integer.parseInt(str);
matricea[x][y] = str_int;
System.out.print(matricea [x][y] + " ");
y = y + 1;
}

x = x + 1;
System.out.println(" ");
}


如同

while ( (draw = reader.readLine()) != null ) { 
processLine(draw);
}


当然,您必须将方法设为 processLine(String line),但这并不难。它只是将您拥有的东西转移到一个单独的方法上。

原始代码的while循环非常忙碌且混乱,但是使用后一个选项可以使目的明确,代码干净。

当然,每种情况都是不同的,并且您可能会发现仅将部分代码删除到方法中将是更好的解决方案。随便看看,看看有什么意义。



错误!

原始码

for (int j = 1; j <= 20; j++) { 
int drawnNumber = Integer.parseInt(pieces[j]);
numbers[drawnNumber]++;
}


该代码不起作用,因为 pieces是在其上方的while循环中声明的,并且对于上述循环而言是局部的。此for循环不在 pieces存在的范围之内。

我将告诉您如何解决它,但是我不确定代码应该做什么。请让我知道其目的是什么,我将为您提供解决方案。



格式化后!

应用上面的注释后,代码可能会是这样。我已对已更改的零件添加了注释。

public static void main(String args[]) {

try {
doKenoStuff();
} catch(IOException e) {
System.out.println("There was a problem opening and processing the file.");
}

}

public static void doKenoStuff() throws IOException {
BufferedReader reader = new BufferedReader(
new FileReader("C:\\keno.txt")
);

int[][] matricea = new int[30][40];
int[] numbers = new int[72]; //each keno draw has 70 numbers

// We can clean up our loop condition by removing
// the assignment (draw = reader.readLine) from it.
// Just make sure draw doesn't begin as null.
String draw = "";
int row;

for(row = 0; draw != null; row++) {
draw = reader.readLine();

// We read a line from the file, then send it
// to extractLineData which will collect the info
// from each column, and update matricea and numbers
extractLineData(draw, row, matricea, numbers);
}

System.out.println("Number of lines: " + row);
System.out.println("Each number's drawing stats:");

for (int i = 0; i < 71; i++) {
System.out.println(i + ": " + numbers[i]);
}

reader.close();

}

public static void extractLineData(String line, int row, int[][] matrix, int[] numbers) {
String linePieces = line.split(" +");

for(int column = 0; column < linePieces.length; column++) {
int number = Integer.parseInt(linePieces[column]);
matrix[row][column] = number;
numbers[number]++;
}
}






注意:我也不是完美的,我的代码也不是。我并不是要说我的建议无论如何都是唯一的方法。它肯定可以改进,但这是一个开始。您应该采用我的解决方案,然后看看如何自己进行改进。
您会发现什么可以以更简洁,更快或更佳的方式进行编码?

那么,我们如何解决该问题呢?

我们有一个从文件开头到文件末尾读取的方法,它记录在 matricea中找到的数据。

一种快速简便的解决方案是简单地使该方法采用两个参数,即起始行号和结束行号。

public static void doKenoStuff(int start, int end) throws IOException {


然后,我们简单地循环一下以跳过起点!就这么简单!!!

for(int i = 0; i < start - 1; i++) {
reader.readLine();
}


不要忘记,我们可能不再需要30个大行 matricea成为30个行。我们可以将其缩小到 end - start + 1。这样,如果用户想从第45行读到第45行,则只需要 45 - 45 + 1 = 1中的 matricea行。

int[][] matricea = new int[end - start + 1][40];


最后我们需要添加的是线读取循环中的条件,该条件可以防止我们越过终点线。

for(row = 0; draw != null, row <= end; row++) {


那里有它。就那么简单!



完整的解决方案

public static void main(String args[]) {
int start = 7, end = 18;

try {
doKenoStuff(start, end);
} catch(IOException e) {
System.out.println("There was a problem opening and processing the file.");
}
}

public static void doKenoStuff(int start, int end) throws IOException {
BufferedReader reader = new BufferedReader(
new FileReader("C:\\keno.txt")
);

int[][] matricea = new int[end - start + 1][40];
int[] numbers = new int[72]; //each keno draw has 70 numbers

for(int i = 0; i < start - 1; i++) {
reader.readLine();
}

String draw = "";
int row;

for(row = 0; draw != null, row <= end; row++) {
draw = reader.readLine();
extractLineData(draw, row, matricea, numbers);
}

System.out.println("Number of lines: " + row);
System.out.println("Each number's drawing stats:");

for (int i = 0; i < 71; i++) {
System.out.println(i + ": " + numbers[i]);
}

reader.close();
}

public static void extractLineData(String line, int row, int[][] matrix, int[] numbers) {
String linePieces = line.split(" +");

for(int column = 0; column < linePieces.length; column++) {
try {
int number = Integer.parseInt(linePieces[column]);
matrix[row][column] = number;
numbers[number]++;
} catch (NumberFormatException) {
// You don't have to do anything in this block, but
// you can print out what input gave the exception if you want.
System.out.println("Bad input: \"" + linePieces[column] + "\"");
}
}
}

关于java - 二维数组或文件中线的处理范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36656388/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com