How to get the first column's contents from a 2D array

前提是你 提交于 2019-12-06 10:29:00
Matthew

You need to use the debugger on you IDE and step through your code to see exactly what is going on. The short answer to me looks like you are clobbering the same field with read data twice for k=0 and k=1.

EDIT

Also in your update, I think you are looking for this in your second print loop (not that it matters, could just as easily be 2, but this is better IMO):

for (int j=0;j<data[i].length;j++){

EDIT Here is the code I think you want explicitly:

//Only print X
public static void printX(float[][] data){

    for (int i=0;i<data.length;i++){
       System.out.println(data[i][0]);
    }
}

//Only print Y
public static void printY(float[][] data){
    for (int i=0;i<data.length;i++){
       System.out.println(data[i][1]);
    }
}

//Print both
public static void printBoth(float[][] data){
    for (int i=0;i<data.length;i++){
       System.out.println(data[i][0] + ", " + data[i][1]);
    }
}


//Print any number in array:
public static void printAll(float[][] data){
    for (int i=0;i<data.length;i++){
        for (int j=0;j<data[i].length;j++){
            System.out.print(data[i][j];
            if (j+1 < data[i].length) {
                System.out.print(", ");
            } else {
                System.out.println();
            }
        }
    }
}

Finally, Your array is initializing incorrectly, which is why you are having so much trouble: You are actually writing both values to the X component, so the first time you loop in k you write a the X value to i,j (eg data[0][0]) and print it out. The second time you loop k you write the Y value to the same i,j (eg data[0][0]) again and print it out. This looks like you are printing the array you want, but actually you are writing both values to the same column. You really want something without the k loop:

//Initialise the array with the values from the file
public static float[][] data(float[][] data, Scanner scan){
    int count = 0; 

    for (int i=0;i<data.length;i++){
        for (int j=0;j<data[0].length;j++){
            count++;    
            if(count<data.length*data[0].length){
                data[i][j] = (float)   IOUtil.skipToDouble(scan); 
                System.out.print(data[i][j] + "  ");
            }    
        }
        System.out.println();
    }
    return data;    
}

If you want to enforce 2 columns which I think k is doing, something like:

public static float[][] data(float[][] data, Scanner scan){
    for (int i=0;i<data.length;i++){
        for (int j=0;j<2;j++){
            data[i][j] = (float)   IOUtil.skipToDouble(scan); 
            System.out.print(data[i][j] + "  ");
        }
        System.out.println();
    }
    return data;    
}

count is also unnecessary as it is just a different way of controlling the total size of the array which it already handled / limited by looping each column (or in the second example where you know it is two wide) by the data.length / data[0].length

EDIT Added by the OP:

To clarify for anyone who still does not get it who maybe is confused about the same thing I was: I misunderstood where the values were being stored so this is why I set the problem up wrong and none of the short answers were making any sense.

I took the whole thing a bit too literally, assuming that the value[here][] was holding the values from the first column and the value[][here] was holding the values from the second column.

I am not sure why I held onto this, but I think it has something to do with how I had been using 1D arrays (without needing to tell them to have a column).

Don't understand your code, but I hope this helps:

float[][] data = new float[10][2];
// ... fill the array with data
// print 'left' column:
for (int i = 0; i < data.length; i++) {
    System.out.println(data[i][0]);
}

What are you trying to do with this part of your code?

for(int k=0;k<2; k++){
    data[i][j] = (float)   IOUtil.skipToDouble(scan); 
    System.out.print(data[i][j] + "  ");    
}

You are writing into data[i][j] twice, and thus overwrite the first value returned by

(float) IOUtil.skipToDouble(scan);

It's hard to tell what the code should be without seeing your input file, but I think you are looking for something like this:

public static float[][] data(float[][] data, Scanner scan){
    for (int i = 0; i < data.length; i++) {
        for (int j = 0; j < data[i].length; j++) {
            data[i][j] = (float) IOUtil.skipToDouble(scan); 
            System.out.print(data[i][j] + "  ");    
        }
        System.out.println();
    }
    return data;
}

While putting data in 2D array you are overwriting the content of array twice within the for loop for(int k=0;k<2; k++). For example:consider the case when i = 0:

  1. At k = 0, data[0][0] = 13.97
  2. At k = 1, data[0][0] = 2.2 (Overwrites 13.97) Whereas, the desired result that you are looking for is data[0][0] = 13.97 and data[0][1]=2.2

You should use the following code to fill the 2D array:

public static float[][] data(float[][] data, Scanner scan){
    int count = 0; 

    for (int i=0;i<data.length;i++){
        for (int j=0;j<data[0].length;j++){
            count++;    
            if(count<data.length*data[0].length){
                for(int k=0;k<2; k++){

                    data[i][j] = (float)   IOUtil.skipToDouble(scan); 
                    System.out.print(data[i][j] + "  ");    
                    j = j+1;
                }

            System.out.println();
            }   
        }

    }
    return data;    

}

And following Code to read the data:

public static void printX(float[][] data)
{
    for (int i=0;i<data.length;i++)
    {
        System.out.println(data[i][0]);
    }
}

Also If condition if(count<data.length*data[0].length) fails for some value of i then in that case you will have data[i][0] = 0 and data[i][1] = 0 . You should also consider this fact and should expect 0 as some of the outputs by printX .

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!