2014-01-31 172 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()); 
     } 
    } 

}