为什么我的字符串不会改变?

时间:2013-12-06 08:52:59

标签: java

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]都是空的...

8 个答案:

答案 0 :(得分:8)

您需要在while循环之外声明变量i以使其保持递增。

现在你是

  • 以值0
  • 声明它
  • 将值分配给第一个数组位置
  • 增加i,然后
  • 在下一次循环迭代时再次使用值0声明它。

所以,只需更改你的行:

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