java中用Collections.sort ,有时会报IllegalArgumentException错误,网上众说纷纭,终于在stak overflow上找到最靠谱答案。
例如:
1 Collections.sort(userItemList,new UserItemPairR());
其中UserItemPairR()函数这么写,就有可能会报错:
class UserItemPairR implements Comparator { public int user; public int item; double r; @Override public int compare(Object o1, Object o2) { UserItemPairR uipr1=(UserItemPairR)o1; UserItemPairR uipr2=(UserItemPairR)o2; if(uipr1.r>uipr2.r) return -1; else return 1 } }
本意是当等于时就不用排了,放前放后都一样,但是这是有问题的,例如:
当A=B时,compare(A,B)和compare(B,A)都会返回1,编译器不会知道他们相等,这就产生矛盾,就会抛出异常。
应改为
1 class UserItemPairR implements Comparator 2 { 3 public int user; 4 public int item; 5 double r; 6 @Override 7 public int compare(Object o1, Object o2) { 8 9 UserItemPairR uipr1=(UserItemPairR)o1; 10 UserItemPairR uipr2=(UserItemPairR)o2; 11 12 if(uipr1.r>uipr2.r) 13 return -1; 14 else if(uipr1.r<uipr2.r) 15 return 1; 16 else 17 return 0; 18 } 19 20 }
这样就不会抛异常了。