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
