简体   繁体   中英

Why doesn't my string change?

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++;
    }
}

When I use this method with

String men[] = new String[501];
double menGrade[] = new double[501];
read(men, menGrade, "MR");

My men[0] is assigned a String but men[1] to men [500] are all null ...

You need to declare your variable i outside of the while loop to keep it incremented.

Right now you are

  • declaring it with value 0
  • assign the values to the 1st array position
  • increment i, and then
  • declare it again with value 0 at the next loop iteration.

SO, just change your lines:

while (in.hasNext()) {
    int i = 0;

to

int i = 0;
while (in.hasNext()) {

Your code has also other issues which you should adress in some way. I do not know why you initialize your array with a fixed size of 500 and also check some conditions before you add your men and grades to those Arrays. This will however lead to a few problems if you are not careful.

Right now you would have holes in your array whenever the if condition does not evaluate to true.

Also your program would crash if there is more than 500 entries in your file.

A rather good solution when dealing with dynamic data structures (so, when you do not know beforehand how many records you will have exactly), is to use a dynamic data structure.

In java you can have a look at java.util.List interface and probably java.util.ArrayList as a good implementation. Here is also the java doc of that class: Java Doc

Here you find more on the collections api which are a good thing for dynamic data structures: Collections - List tutorial

while (in.hasNext()) {
  int i = 0;
  ...

This will RESET i each time you start the while loop and you always overwrite a[0] and b[0].

swap these two lines! (so the int i = 0; comes before the loop:

int i = 0;
while (in.hasNext()) {
  ...

You should increment i in your if statement and not always like you do now. You don't want holes in your men array.

This simply means, either your loop is executing only once. Or, if block in loop is exceuting only once.

Dependecy is on the content of file you are importing and your if condition.

I'm pretty sure that something is wrong with your "data.txt" that caused the while loop to execute only once. Otherwise, I don't see any mistake in the code.

Why don't you check the value of i during the execution of the program?

如果您data.txt文件中包含One单一的线,则对应的while将运行一次填充数组的第一个元素,即men在你的情况

The reason is this:

while (in.hasNext()) {
    int i = 0;
    ...
    i++;
}

you are destroying and creating i variable each time loop is executed effectively reseting it to 0 each time. Asides from notes from other answers you can simply move i outside the loop:

int i = 0;
while (in.hasNext()) {
    ...
    i++;
}

Now I can't run in myself , but I see

while (in.hasNext()) {
        int i = 0;
//other
  a[i] = id + "\t" + name + "\t" + lastname + "\t" + grade;
            b[i] = grade;
        }
        i++;

If you use a counter i over an array/Collection, generally you have to give a greater scope to counter. if the counter is inside the while, at every iteration you recreate the counter and you point always at the same element of array

The/one solution can be:

int i=0;
while (in.hasNext()) {
//etc

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM