2

如何从二维数组中提取第一列?我正在用这样的方法初始化我的数组

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

谁能澄清我如何才能最好地从二维数组中获取左侧列上的数据?或者如果有其他方法可以实现这种事情?

4

5 回答 5

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 添加:

为了向那些仍然不明白的人澄清一下,他们可能对我曾经遇到的同一件事感到困惑:我误解了值的存储位置,所以这就是为什么我把问题设置错了,而且所有简短的答案都没有任何意义。

假设 value[here][] 保存了第一列中的值,而 value[][here] 保存了第二列中的值,我对整个事情的理解有点过分了。

我不确定我为什么坚持这一点,但我认为这与我使用一维数组的方式有关(不需要告诉他们有一个列)。

于 2013-01-24T23:04:59.610 回答
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]);
}
于 2013-01-24T23:04:40.893 回答
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;
}
于 2013-02-11T16:55:33.910 回答
1

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

  1. 在 k = 0 时,数据[0][0] = 13.97
  2. 在 k = 1 时,data[0][0] = 2.2(覆盖 13.97)而您想要的结果是 data[0][0] = 13.97 和 data[0][1]=2.2

您应该使用以下代码来填充二维数组:

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;    

}

并按照代码读取数据:

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

此外,如果条件对于 thenif(count<data.length*data[0].length)的某个值失败,i那么在这种情况下,您将拥有 data[i][0] = 0 和 data[i][1] = 0 。您还应该考虑这个事实,并且应该期待 0printX 的一些输出。

于 2013-02-11T20:59:07.307 回答
0

检查此解决方案

public static void main(String[] arg) {
    int a[][] = { { 1, 2, 3 }, { 4, 9, 6 }, { 5, 7, 9 } };// new int[3][3];

    for(Values val:getValues(a, 1)){
        fillRow(a, val.row);
        fillCol(a, val.col);
    }
    
   printAll(a);
}

private static List<Values> getValues(int a[][], int ele){
    List<Values> list = new ArrayList<Values>();
    for(int i=0;i<a.length;i++){
        for(int j=0;j<a[i].length;j++){
            if(a[i][j] == ele){
                list.add(new Values(i,j));
            }
        }
    }
    return list;
}

private static class Values{
    public Values(int i, int j) {
        row = i;
        col = j;
    }
    int row;
    int col;
}

private static void printAll(int a[][]){
    for(int i[]:a){
        for(int j:i){
            System.out.print(" "+j);
        }
        System.out.println("\n");
    }
}

private static void fillRow(int a[][], int row){
    for(int i=0;i<a.length;i++){
        a[i][row] = 0;
    }
}

private static void fillCol(int a[][], int col){
    for(int i=0;i<a.length;i++){
        a[col][i] = 0;
    }
}
于 2021-09-21T10:03:29.663 回答