public static void read(String a[], double b[], String c) throws IOException {
Scanner in = new Scanner(new File("data.txt"));
while (in.hasNext()) {
int i = 0;
String id = in.next();
String name = in.next();
String lastname = in.next();
double grade = in.nextDouble();
if (name.substring(0, 2).equalsIgnoreCase(c)) {
a[i] = id + "\t" + name + "\t" + lastname + "\t" + grade;
b[i] = grade;
}
i++;
}
}
当我使用此方法
时String men[] = new String[501];
double menGrade[] = new double[501];
read(men, menGrade, "MR");
我的男人[0]被分配了一个字符串但男人[1]被分配给男人[500]都是空的...
答案 0 :(得分:8)
您需要在while循环之外声明变量i
以使其保持递增。
现在你是
所以,只需更改你的行:
while (in.hasNext()) {
int i = 0;
到
int i = 0;
while (in.hasNext()) {
您的代码还有其他问题,您应该以某种方式解决这些问题。 我不知道为什么你用固定大小的500初始化你的数组,并且在你将你的男人和成绩添加到那些数组之前检查一些条件。但是,如果你不小心,这将导致一些问题。
现在,只要if条件的评估结果为true,就会在数组中出现漏洞。
如果您的文件中有超过500个条目,您的程序也会崩溃。
处理动态数据结构时的一个相当好的解决方案(因此,当你事先不知道你将拥有多少条记录时)就是使用动态数据结构。
在java中,您可以查看java.util.List
接口,可能java.util.ArrayList
作为一个很好的实现。
这里也是该类的java文档:Java Doc
在这里,您可以找到有关动态数据结构好处的集合api的更多内容:Collections - List tutorial
答案 1 :(得分:3)
while (in.hasNext()) {
int i = 0;
...
每次启动while循环时都会重置i,你总是会覆盖[0]和b [0]。
交换这两行! (所以int i = 0;在循环之前出现:
int i = 0;
while (in.hasNext()) {
...
答案 2 :(得分:1)
您应该在if语句中增加i
,而不是像现在这样。你不希望你的男人阵列出洞。
答案 3 :(得分:0)
这只是意味着,你的循环只执行一次。 或者,如果循环中的块仅仅是一次。
依赖性取决于您导入的文件内容和if条件。
答案 4 :(得分:0)
我很确定你的“data.txt”出现问题导致while循环只执行一次。否则,我在代码中看不到任何错误。
为什么不在执行程序时检查i的值?
答案 5 :(得分:0)
如果您的data.txt
文件包含One
单行,那么相应的while
将会运行一次,填充数组的第一个元素,即men
在您的情况下
答案 6 :(得分:0)
原因是:
while (in.hasNext()) {
int i = 0;
...
i++;
}
每次循环执行时,您正在销毁并创建i
变量,每次有效地将其重置为0。除了来自其他答案的注释之外,您只需将i
移到循环之外:
int i = 0;
while (in.hasNext()) {
...
i++;
}
答案 7 :(得分:0)
现在我不能自己跑,但我看到了
while (in.hasNext()) {
int i = 0;
//other
a[i] = id + "\t" + name + "\t" + lastname + "\t" + grade;
b[i] = grade;
}
i++;
如果您对数组/集合使用计数器 i ,通常您必须提供更大的计数范围。 如果计数器在while内,则在每次迭代时重新创建计数器并始终指向数组的相同元素
/ one解决方案可以是:
int i=0;
while (in.hasNext()) {
//etc