2012-12-18 57 views
0

可能重複:
Sort a two dimensional array based on one columnJava中,對關鍵字排序多維數組

我擁有的數據:

"Something1" "TRUE" 
"Something2" "FALSE" 
"Something3" "FALSE" 
"Something4" "TRUE" 

那我再多維數組存儲:

String[][] myData = new String[data.length][2]; 

現在我想解決這陣列,使其由「TRUE」命令第一,所以就變成:

"Something1" "TRUE" 
"Something4" "TRUE" 
"Something2" "FALSE" 
"Something3" "FALSE" 

我看Arrays.sort();但不知道如何實現這一點,或者如果這是最好的方法。

+1

的http://stackoverflow.com/questions/4907683/sort-a-two-dimensional-array-based-on-one-column – dinesh707

+0

而不是'的String [] []'你應該使用' YourClass []'其中'YourClass'是一個你自己編寫的類,它包含所需的信息和'implements Comparable ' – jlordo

回答

2

排序的陣列使用自定義的比較:

Arrays.sort(myData , new Comparator<String[]>() { 
      @Override 
      public int compare(String[] o1, String[] o2) { 
       return ((String) o2[1]).compareTo(o1[1]); 
      } 
     }); 
+0

感謝它現在排序,但是錯誤的是真實的,任何想法如何排序反向? – ubergam3r

+0

@ ubergam3r你可以使用'return((String)o1 [1])。compareTo(o2 [1]);' – Juvanis

+0

當然愚蠢的我......抱歉大腦有點油炸。謝謝您的幫助 – ubergam3r

0

如果你必須使用一個數組,我會用Arrays.sort()使用自定義比較。該比較器將排序String[]合適的元素傳入。

我可能不會使用多維數組,而是爲您的數組的每一行實現一些對象。這些數據看起來緊密聯繫在一起,而不僅僅是數組中的元素。您可以適當地鍵入它 - 此時您將一個布爾值存儲爲一個字符串。

0

確定您在這裏。兩個自包含的示例解決方案,您可以從測試主類運行。第一個使用多維數組。

Object values[][] = new Object[][] { 
      { "a", Boolean.FALSE }, 
      { "b", Boolean.TRUE }, 
      { "c", Boolean.TRUE },    
    }; 

    Arrays.sort(values, 
      new Comparator<Object[]>() { 
       @Override 
       public int compare(Object[] tuple1, Object[] tuple2) { 
        int result = -1*((Boolean) tuple1[1]).compareTo((Boolean) tuple2[1]); 
        if (result == 0) { 
         result = ((String) tuple1[0]).compareTo(((String) tuple2[0])); 
        }      
        return result; 
       } 
      } 
    ); 

    for (Object[] tuple : values) { 
     System.out.println(Arrays.toString(tuple)); 
    } 

第二個使用通用(和類型更安全)的元組。

class Tuple<A, B> { 
     private final A first; 
     private final B second; 

     public Tuple(A first, B second) { 
      this.first = first; 
      this.second = second; 
     } 

     public A getFirst() { 
      return this.first; 
     } 

     public B getSecond() { 
      return this.second; 
     } 

     /** 
     * {@inheritDoc} 
     */ 
     @Override 
     public String toString() { 
      return "[first=" + first.toString() + ",second=" + second.toString() + "]"; 
     } 
    }; 

    Tuple<String, Boolean> values[] = new Tuple[] { 
      new Tuple<String, Boolean>("a", Boolean.FALSE), 
      new Tuple<String, Boolean>("b", Boolean.TRUE), 
      new Tuple<String, Boolean>("c", Boolean.TRUE),    
    }; 

    Arrays.sort(values, 
      new Comparator<Tuple<String, Boolean>>() { 
       @Override 
       public int compare(Tuple<String, Boolean> tuple1, Tuple<String, Boolean> tuple2) { 
        int result = -1*tuple1.getSecond().compareTo(tuple2.getSecond()); 
        if (result == 0) { 
         result = tuple1.getFirst().compareTo(tuple2.getFirst()); 
        }      
        return result; 
       } 
      } 
    ); 

    for (Tuple<String, Boolean> tuple : values) { 
     System.out.println(tuple); 
    }