2011-10-11 61 views
1

我知道如何排序是有兩列的排列:的Java數組排序

Arrays.sort(myarray, new Comparator<String[]>() { 
        @Override 
        public int compare(String[] entry1, String[] entry2) { 
         String time1 = entry1[0]; 
         String time2 = entry2[0]; 
         return time2.compareTo(time1); 
        } 
       }); 

此排序第一列arrray。 但是如果我有更多的列呢?例如。

myarray[0][0]= +3620205252 
myarray[0][1]= 32534 
myarray[0][2]= Franco Nera 
myarray[0][3]= 183 
myarray[1][0]= +3658300234 
myarray[1][1]= 4334 
myarray[1][2]= Judy Moira 
myarray[1][3]= 28 

etc .. 我想排序這個例如由第二列或第四列... 我可以嘗試通過創建一個新的數組[第1 +第3 +第4列] [第2列],然後使用上述解決方案對其進行排序,然後將元素除此之外,但這太環境。

+1

有什麼問題? 'entry [0]'是第一列,'entry [1]'是第二列,'entry [2]'是第三列等等。只需比較'entry1 [3]'和'entry2 [3]'來比較第四列。儘管如此,你應該把你的數據放在適當的對象中而不是字符串數組中。 –

+2

你應該真的使用對象。該數組應該是一個對象數組,每個對象有4個屬性(時間,名稱等)。 –

回答

1

這是同樣的事情有兩列,但更多的列:您只要您的比較器檢查您關心的列,就可以根據需要對多列或多列進行排序。

要按多個排序,您需要決定比較順序並在列不相等時返回compareTo結果。

切線,爲什麼你會使用這個數組呢?它是Java,不如像對象或其他東西一樣使用。

+0

我試過了,但我的應用程序部隊關閉了,並認爲這導致了關閉。現在我解決了這個錯誤,它的工作原理,謝謝大家! – erdomester

1

您必須遍歷兩個數組,直到找到索引的元素不同,並返回該索引處字符串的比較。這與用於比較字符串的想法基本相同。

for(int i=0;i<Math.min(entry1.length,entry2.length);i++){ 
    String x=entry1[i], y=entry2[i]; 
    int diff=x.compareTo(y); 
    if (diff!=0) return diff; 
} 
if (entry1.length==entry2.length) return 0; 
else return entry1.length-entry2.length; 

上面的代碼也處理數組可能沒有相同列數的情況。

2

要由不同列進行排序只是在這些行替換[0]

String time1 = entry1[0]; 
String time2 = entry2[0]; 

如果您想通過多個列進行排序,您需要首先由最高階偏好,例如比較:

String time1 = entry1[0]; 
String time2 = entry2[0]; 
int cmp = time2.compareTo(time1); 

,然後,如果結果是零(即他們是平等的)由下一個優先級最高的比較:

if (cmp == 0) { 
    String s1 = entry1[1]; 
    String s2 = entry2[1]; 
    cmp = s2.compareTo(s1); 
} 

return cmp; 
1

下面是一個例子:

public static class ColumnComparator<T extends Comparable> 
     implements Comparator<T[]> { 
    private int column; 

    public ColumnComparator(int column) { 
     this.column = column; 
    } 

    public int compare(T[] o1, T[] o2) { 
     return o1[column].compareTo(o2[column]); 
    } 
} 

像這樣來使用:

Arrays.sort(myarray, new ColumnComparator<String>(1)); 

它可以很容易地推廣到比較多列。

0

我認爲最簡單的方法是使用字符串的臨時數組,因爲你有一個字符串數組 -

樣品陣列:

String array[][][] = { 
     { 
      {"Hello", "World"}, 
      {"Apple", "Orange"} 
     }, 
     { 
      {"Zebra", "Cow"}, 
      {"Cat", "Ball"} 
     }, 
     { 
      {"Elephant", "Whale"}, 
      {"Lion", "Monkey"} 
     }     
}; 

字符串的臨時數組:

String[] tempArray = new String[array.length * array[0].length * array[0][0].length]; 

填充臨時陣列:

int tempIndex = 0; 
for(int i=0; i<array.length; i++) { 
    for(int j=0; j<array[i].length; j++) { 
     for(int k=0; k<array[i][j].length; k++) { 
      System.out.println("array[" + i + "][" + j + "][" + k + "]: " + array[i][j][k]); 
      tempArray[tempIndex++] = array[i][j][k]; 
     } 
    } 
} 

這也打印 - 如果打印的元素

tempIndex = 0; 
for(int i=0; i<array.length; i++) { 
    for(int j=0; j<array[i].length; j++) { 
     for(int k=0; k<array[i][j].length; k++) {      
      array[i][j][k] = tempArray[tempIndex++]; 
     } 
    } 
} 

現在 -

 
array[0][0][0]: Hello 
array[0][0][1]: World 
array[0][1][0]: Apple 
array[0][1][1]: Orange 
array[1][0][0]: Zebra 
array[1][0][1]: Cow 
array[1][1][0]: Cat 
array[1][1][1]: Ball 
array[2][0][0]: Elephant 
array[2][0][1]: Whale 
array[2][1][0]: Lion 
array[2][1][1]: Monkey 

現在,排序的臨時數組 -

Arrays.sort(tempArray); 

填寫原數組排序的值原來的陣列再次,它應該打印 -

 
array[0][0][0]: Apple 
array[0][0][1]: Ball 
array[0][1][0]: Cat 
array[0][1][1]: Cow 
array[1][0][0]: Elephant 
array[1][0][1]: Hello 
array[1][1][0]: Lion 
array[1][1][1]: Monkey 
array[2][0][0]: Orange 
array[2][0][1]: Whale 
array[2][1][0]: World 
array[2][1][1]: Zebra