【Java】对ArrayList排序
java如何对ArrayList中对象按照该对象某属性排序
(从小到大)
两种方法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | 方法一:<br>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 ; } } }; |
调用方法:
1 2 3 | List<KNNNode> nodelist = new ArrayList<KNNNode>(); //此处需要填充nodelist.add(); Collections.sort(nodelist, comparator); // 调用 |
1 2 3 4 5 6 7 8 9 10 11 | 方法二:<br> 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 ; } } } |
调用方法:
1 | Collections.sort(nodelist, new SortBy()); |
KNNNode结点内的属性:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | 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
我最终的实现代码是:(从大到小排序)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | 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