簡體   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