java如何對ArrayList中對象按照該對象某屬性排序
(從小到大)
兩種方法:
方法一:
Comparator<KNNNode> comparator = new Comparator<KNNNode>() { @Override public int compare(KNNNode o1, KNNNode o2) { System.out.println("進入 compare function"); // TODO Auto-generated method stub if (o1.getDistance() <= o2.getDistance()) {//o1屬性小於等於o2屬性時,返回1 return 1; } else { return -1; } } };
調用方法:
List<KNNNode> nodelist = new ArrayList<KNNNode>(); //此處需要填充nodelist.add(); Collections.sort(nodelist, comparator);// 調用
方法二:
class SortBy implements Comparator { public int compare(Object obj1, Object obj2) { KNNNode point1 = (KNNNode) obj1; KNNNode point2 = (KNNNode) obj2; if (point1.getDistance() <= point2.getDistance()) { return 1; } else { return 0; } } }
調用方法:
Collections.sort(nodelist, new SortBy());
KNNNode結點內的屬性:
package newKNN; /** * KNN結點類,用來存儲最近鄰的k個元組相關的信息 */ public class KNNNode { private int index; // 元組標號 private double distance; // 與測試元組的距離 private String seq;//滑動窗口motif序列片段 public KNNNode(int index, double distance, String seq) { super(); this.index = index; this.distance = distance; this.seq = seq; } public int getIndex() { return index; } public void setIndex(int index) { this.index = index; } public double getDistance() { return distance; } public void setDistance(double distance) { this.distance = distance; } public String getSeq() { return seq; } public void setSeq(String seq) { this.seq = seq; } }
我想要按照KNNNode的distance屬性排序。
若要按照從大到小的順序排序,如果只是將
>=返回值改為-1
<返回值改為1 會出現異常。
Comparison method violates its general contract!
原因是是實現接口Comparator 的類有問題,在compare中沒有處理好兩個比較的對象相等的情況
public int compare(KNNNode o1, KNNNode o2); 即 o1.getDistance() == o2.getDistance() 時,返回值不是0
我最終的實現代碼是:(從大到小排序)
Comparator<KNNNode> comparator = new Comparator<KNNNode>() { @Override public int compare(KNNNode o1, KNNNode o2) { // TODO Auto-generated method stub if (o1.getDistance() < o2.getDistance()) { return 1; } else if(o1.getDistance() > o2.getDistance()){ return -1; }else{ return 0; } } };
參考列表:
http://blog.csdn.net/telenewbie/article/details/45061089
http://www.cnblogs.com/xujian2014/p/5215082.html
http://www.cnblogs.com/fzzl/archive/2010/08/14/1799408.html