繁体   English   中英

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

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

如何从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阵列获取左侧列的数据? 或者,如果有其他方法来实现这种事情?

您需要在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循环每一列(或在第二个例子中,你知道它是两个宽) data[0].length

编辑由OP添加:

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

假设值[here] []持有第一列的值而值[] [here]保持第二列的值,我把整个事情略微过于字面意思。

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

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

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

你想用这部分代码做什么?

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

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

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

您应该使用以下代码来填充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值失败,那么在这种情况下你将得到data [i] [0] = 0和data [i] [1] = 0 。 您还应该考虑这个事实,并且应该期望0作为printX的一些输出。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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