java如何对ArrayList中对象按照该对象某属性排序
(从小到大)
两种方法:
方法一:
Comparator comparator = new Comparator() {
@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 nodelist = new ArrayList();
//此处需要填充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
Comparison method violates its general contract!
原因是是实现接口Comparator 的类有问题,在compare中没有处理好两个比较的对象相等的情况
public intcompare(KNNNode o1, KNNNode o2);
即 o1.getDistance() == o2.getDistance() 时,返回值不是0
我最终的实现代码是:(从大到小排序)
Comparator comparator = new Comparator() {
@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;
}
}
};
参考列表: