如何从2D数组中获取第一列的内容

时间:2013-01-24 22:57:32

标签: java arrays 2d

如何从2D数组中拉出第一列?我正在用这样的方法初始化我的数组

//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){
                for(int k=0;k<2; k++){

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

            System.out.println();
            }   
        }

    }
    return data;    

}

这是我的测试文件的内容。 (请记住文件可以是任何长度)

13.97  2.2  
12.05  1.9  
9.99  1.5  
8.0  1.3  
6.0  0.9  
4.0  0.6  
2.0  0.3  
0.0  0.0  
-2.0  -0.3  
-4.0  -0.6  
-6.02  -0.9  
-8.0  -1.3  
-9.99  -1.6  
-12.03  -1.9  
-13.98  -2.2
终端上的

但问题是当我尝试调用左栏时,我得到了正确的列。我不确定这是否是因为右边的值是唯一存储或不存储的值。

      //should print x but actually prints y 
   public static void printX(float[][] data){

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

                System.out.println(data[i][j]);
            }
        }
    }

输出

2.2
1.9
1.5
1.3
0.9
0.6
0.3
0.0
-0.3
-0.6
-0.9
-1.3
-1.6
-1.9
-2.2
0.0

任何人都可以澄清我如何才能最好地从2D阵列获取左侧列的数据?或者,如果有其他方法来实现这种事情?

4 个答案:

答案 0 :(得分:5)

您需要在IDE上使用调试器并逐步执行代码以查看确切的内容。对我来说,简短的回答看起来像是在k = 0和k = 1时两次读取数据的同一个字段。

修改

同样在你的更新中,我认为你在第二个打印循环中寻找这个(不重要,可能很容易就是2,但这是更好的IMO):

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

编辑以下是我认为你想要的代码:

//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();
            }
        }
    }
}

最后,您的数组初始化不正确,这就是您遇到这么多麻烦的原因:您实际上是将两个值都写入X组件,因此第一次在k中循环时,将X值写入i,j (例如data[0][0])并将其打印出来。第二次循环k时,再次将Y值写入相同的i,j(例如data[0][0])并打印出来。这看起来像是要打印所需的数组,但实际上您将两个值都写入同一列。你真的想要没有k循环的东西:

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

如果你想强制执行我认为k正在做的2列,比如:

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也是不必要的,因为它只是通过循环每一列来控制已经处理/限制的数组总大小的另一种方式(或者在第二个例子中,你知道它是两个宽) data.length / data[0].length

编辑由OP添加:

为了澄清任何仍然没有得到它的人可能对我所做的事情感到困惑:我误解了存储值的位置所以这就是为什么我把问题设置错误而没有简短的答案在做什么任何意义。

我假设值[here] []持有第一列的值而值[] [here]保持第二列的值,所以我把整个事情略微过分了。

我不知道为什么我坚持这个,但我认为它与我如何使用1D数组有关(不需要告诉他们有一个列)。

答案 1 :(得分:4)

不理解你的代码,但我希望这会有所帮助:

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]);
}

答案 2 :(得分:3)

您要对代码的这一部分做什么?

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

您正在写入data[i][j]两次,因此会覆盖

返回的第一个值
(float) IOUtil.skipToDouble(scan);

如果没有看到输入文件,很难说代码应该是什么,但我认为你正在寻找这样的东西:

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

答案 3 :(得分:1)

  

将数据放入2D数组时,您将覆盖内容   for循环for(int k=0;k<2; k++)中的数组的两次。对于   例子:考虑i = 0时的情况:

     
      
  1. 在k = 0时,数据[0] [0] = 13.97
  2.   
  3. 在k = 1时,数据[0] [0] = 2.2(覆盖13.97)然而,您要查找的所需结果是数据[0] [0] = 13.97并且   数据[0] [1] = 2.2
  4.   

您应该使用以下代码填充2D数组:

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;    

}

按照Code读取数据:

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

如果条件if(count<data.length*data[0].length)因某些i值失败,那么在这种情况下,您将拥有数据[i] [0] = 0并且   data [i] [1] = 0。你也应该考虑这个事实并且应该期待   0作为printX的一些输出。