【发布时间】:2018-03-20 02:01:04
【问题描述】:
我正在尝试使用以下参数对对象列表进行排序
a.将partId与其他对象id相同的两个list对象分组
b.将 partId 为 null 的任何对象推送到列表末尾。
c。根据计数升序对分组的对象进行排序,首选是
我。组中的两个对象的计数都应该更少
二。那么组中的任何对象的计数都比其他组少。
下面是我目前的代码,
public class ListTTest {
public static void main(String[] args) {
LstObj lstObj1 = new LstObj("0:0:1", "1:0:1", 49);
LstObj lstObj2 = new LstObj("0:0:2", "1:0:2", 2);
LstObj lstObj3 = new LstObj("0:2:1", "1:2:1", 0);
LstObj lstObj4 = new LstObj("0:2:2", null , 0);
LstObj lstObj5 = new LstObj("0:2:3", "1:2:3" , 2);
LstObj lstObj6 = new LstObj("0:2:4", "1:2:4" , 49);
LstObj lstObj7 = new LstObj("1:0:1", "0:0:1" , 49);
LstObj lstObj8 = new LstObj("1:0:2", "0:0:2" , 49);
LstObj lstObj9 = new LstObj("1:2:1", "0:2:1" , 0);
LstObj lstObj10 = new LstObj("1:2:2", null , 0);
LstObj lstObj11 = new LstObj("1:2:3", "0:2:3" , 49);
LstObj lstObj12 = new LstObj("1:2:4", "0:2:4" , 49);
LstObj lst[] = new LstObj[]{lstObj1,lstObj2,lstObj3,lstObj4,lstObj5,lstObj6,lstObj7,lstObj8,lstObj9,lstObj10,lstObj11,lstObj12};
List<LstObj> lstArr = Arrays.asList(lst);
lstArr.sort(new Comparator<LstObj>() {
@Override
public int compare(LstObj o1, LstObj o2) {
if(o1.partId==null){
return 1;
}else if(o2.partId==null){
return -1;
}else{
return -1*(o1.partId.compareTo(o2.id)-(o1.count-o2.count));
}
}
});
System.out.println(lstArr);
}
}
class LstObj {
String partId;
String id;
int count;
public LstObj( String id,
String partId,
int count
) {
this.count = count;
this.partId = partId;
this.id = id;
}
public String getPartId() {
return partId;
}
public String getId() {
return id;
}
public int getCount() {
return count;
}
public void setPartId(String partId) {
this.partId = partId;
}
public void setId(String id) {
this.id = id;
}
public void setCount(int count) {
this.count = count;
}
@Override
public String toString() {
return "LstObj [partId=" + partId + ", id=" + id + ", count=" + count
+ "]\n";
}
}
以上代码的输出是:
[LstObj [partId=1:2:1, id=0:2:1, count=0]
, LstObj [partId=1:2:3, id=0:2:3, count=2]
, LstObj [partId=0:2:1, id=1:2:1, count=0]
, LstObj [partId=1:0:2, id=0:0:2, count=2]
, LstObj [partId=1:2:4, id=0:2:4, count=49]
, LstObj [partId=0:2:3, id=1:2:3, count=49]
, LstObj [partId=1:0:1, id=0:0:1, count=49]
, LstObj [partId=0:0:1, id=1:0:1, count=49]
, LstObj [partId=0:0:2, id=1:0:2, count=49]
, LstObj [partId=0:2:4, id=1:2:4, count=49]
, LstObj [partId=null, id=0:2:2, count=0]
, LstObj [partId=null, id=1:2:2, count=0]
但我正在寻找输出为:
[LstObj [partId=0:2:1, id=1:2:1, count=0]
, LstObj [partId=1:2:1, id=0:2:1, count=0]
, LstObj [partId=0:0:2, id=1:0:2, count=2]
, LstObj [partId=1:0:2, id=0:0:2, count=49]
, LstObj [partId=0:2:3, id=1:2:3, count=2]
, LstObj [partId=1:2:3, id=0:2:3, count=49]
, LstObj [partId=0:0:1, id=1:0:1, count=49]
, LstObj [partId=1:0:1, id=0:0:1, count=49]
, LstObj [partId=0:2:4, id=1:2:4, count=49]
, LstObj [partId=1:2:4, id=0:2:4, count=49]
, LstObj [partId=null, id=0:2:2, count=0]
, LstObj [partId=null, id=1:2:2, count=0]
有人知道我到底哪里做错了吗?
【问题讨论】:
-
不确定错误在哪里,但你应该看看在 Java 8 中添加到 Comparator interface 的方法,例如
comparing()、thenComparing()和nullsLast()。我相信他们可以大大简化您的代码。 -
比较器应该是对称的。像
o1.partId.compareTo(o2.id)这样的术语不可能是正确的。此外,通过减号将两个比较结果与o1.partId.compareTo(o2.id)-(o1.count-o2.count)相结合是没有意义的,因为compareTo返回的值的大小是完全未指定的(无论如何假定的结果是什么)。此外,-1*(…)是一种翻转符号的冗长方式(-(…)也可以),这是一种反转比较器的破坏方式。如果比较器的计算结果为Integer.MIN_VALUE,则翻转符号会导致溢出,再次导致Integer.MIN_VALUE……