2014-01-31 174 views
1

讓我先解釋一下情景:排序值按特定的順序

List<Row> rowValues = new ArrayList<>(); 

// After adding values into list 
At location 0 = [Johnson, 10000] 
At location 1 = [Adam, 12000] 
At location 2 = [Mike, 11000] 
At location 3 = [Johnson, 17000] 
At location 4 = [Tony, 10000] 

我想升序和降序排列的column1元素column2元素進行排序。像:

At location 0 = [Adam, 12000] 
At location 1 = [Johnson, 17000] 
At location 2 = [Johnson, 10000] 
At location 3 = [Mike, 11000] 
At location 4 = [Tony, 10000] 

我不知道這是否能實現這一目標,通過使用:

Collections.sort(rowValues); //or 
Collections.sort(rowValues, Collections.reverseOrder()); 

Row類,如果讓任何意義:

final class Row extends ArrayList<Object> implements Comparable<Row> { 

    private int index; 
    private Order order; 


    Row(int initialCapacity) { 
     super(initialCapacity); 
     this.index = -1; //-1 indicates that the index has not been set 
    } 

    Object getSortingValue() { 
     if (index == -1) { 
      throw new IllegalStateException("Sorting column is unknown"); 
     } else if (isEmpty()) { 
      throw new IllegalStateException("Row is empty"); 
     } 
     return get(index); 
    } 

    void setSortingColumn(int index) throws IllegalArgumentException { 
     if (index < 0) { 
      throw new IllegalArgumentException("Invalid sorting index: " + index); 
     } 
     this.index = index; 
    } 

    Order getOrder() { 
     return order; 
    } 

    void setOrder(Order order) { 
     this.order = order; 
    } 

    @Override 
    public int compareTo(Row row) { 
     if (row == null) { 
      throw new NullPointerException(); 
     } 
     Object sortValue = getSortingValue(); 
     if (sortValue instanceof Comparable) { 
      return ((Comparable) sortValue).compareTo(row.getSortingValue()); 
     } else { 
      throw new IllegalArgumentException(sortValue + " not type of Comparable"); 
     } 
    } 

    @Override 
    public boolean equals(Object obj) { 
     if (obj instanceof Row) { 
      Row row = (Row) obj; 
      return getSortingValue().equals(row.getSortingValue()); 
     } 
     return false; 
    } 

    @Override 
    public int hashCode() { 
     return getSortingValue().hashCode(); 
    } 
} 
+0

創建自己的類,它實現'比較'。你可以讓它定義你想要的訂單。 – rgettman

+0

@Lucky_Singh如果你用你的Row類編輯你的文章,我可以用代碼更新我的答案,以達到你想要的。 –

+0

@ HugoSousa增加了Row類。 –

回答

5

是的,你可以對它進行排序使用Collections.sort(),但您需要定義自己的Comparator,在第一行較大時定義對象比其他對象大,或者如果它們相等,則第二行較大。

1

你需要考慮的的compareTo 2倍的值(兩列)()方法,假設在Row對象相應的字段命名名稱和點 -

public int compareTo(Row row) { 
     if(!name.equals(row.getName()){ 
     return name.compareTo(row.getName()); 
     } 
     return -1 * point.compareTo(row.getPoint()); 
    } 
+0

它應該是'return -1 * point.compareTo( row.getPoint());'因爲OP想要第二列降序?或者是否可以動態指定訂單? – ADTC

+0

謝謝 - 編輯我的答案。這個想法只是表明compareTo()需要考慮2個屬性。我們永遠不知道是什麼點 - 假設它是一個字符串,我已經編輯了答案,以便在第一眼看就清楚了。 – user1339772

+0

其實,我認爲它可以是動態的,使用一些運算符。不知道,但看看[這](http://stackoverflow.com/a/14154534/1134080)。 *你也不需要'equals',因爲'compareTo'可以返回'0',就像那個代碼一樣。* – ADTC

0

我想你想排序名稱爲asc,如果名稱與另一個名稱相同,則按值desc進行排序。如果是這樣,那麼

List<Row> rowValues = new ArrayList<Row>(); 

    // After adding values into list 
    rowValues.add(new Row("Johnson", 10000)); 
    rowValues.add(new Row("Adam", 12000)); 
    rowValues.add(new Row("Mike", 11000)); 
    rowValues.add(new Row("Johnson", 17000)); 
    rowValues.add(new Row("Tony", 10000)); 

    Collections.sort(rowValues, new RowComparator()); 

    System.out.println(rowValues); 

public class Row { 
    private String name; 
    private Integer val; 
    public String getName() { 
     return name; 
    } 
    public void setName(String name) { 
     this.name = name; 
    } 
    public Integer getVal() { 
     return val; 
    } 
    public void setVal(Integer val) { 
     this.val = val; 
    } 
    public Row(String name, Integer val) { 
     super(); 
     this.name = name; 
     this.val = val; 
    } 
    @Override 
    public String toString() { 
     return "Row [name=" + name + ", val=" + val + "]"; 
    } 

} 

import java.util.Comparator; 

public class RowComparator implements Comparator<Row> { 

    public int compare(Row o1, Row o2) { 
     if (o1.getName().equals(o2.getName())) { 
      return -1 * o1.getVal().compareTo(o2.getVal()); 
     } else { 
      return o1.getName().compareTo(o2.getName()); 
     } 
    } 

}