我有一个带有一些属性的通用对象列表,其中一个是整数的集合(treeSet(。
class GenericObject{
Set<Integer> orderNumbers = new TreeSet<>();
Other attributes...
}
我想对这个通用对象列表进行排序,比较 Set...例:
我的实际列表列表;
具有集合的泛型对象 --> 2,3,4
带有集合的泛型对象 --> 1,2
具有集合的泛型对象 --> 4,5
具有集合的泛型对象 --> 2,3
我想像这样对对象列表进行排序:
1( 1,2
2( 2,3
3( 2,3,4
4,5
我正在尝试实现通用对象的比较器并覆盖方法比较,但我没有得到它。
谢谢,我会等待你的回答
由于orderNumbers
是一个Set
元素将按其自然顺序排列,因此您可以比较它的第一个元素和大小。这是比较器:
(a, b) -> {
Integer nexta = a.orderNumbers.iterator().next(),
nextb = b.orderNumbers.iterator().next();
if( nexta == nextb ) {
return a.orderNumbers.size() > b.orderNumbers.size() ? 1 : -1;
}
return Integer.compare(nexta, nextb);
}
演示
在GenericObject
Comparator
中,您必须逐个比较Set
中包含的整数。
您应该依赖 Integer 可比较方法,但对于特定情况(相同的元素但有一个额外的元素(,其中具有较少元素的集合应放在顺序中。
就时间而言,这应该是最直接有效的方法。
如果不需要性能(很少的列表和很少的元素(,您可以将列表的Integer
累积到String
中,并执行字典顺序比较,因为最终这就是您需要的。
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.util.Set;
import java.util.TreeSet;
class GenericObject {
private Set<Integer> orderNumbers;
public GenericObject(Set<Integer> treeSet) {
this.orderNumbers = treeSet;
}
// Other attributes...
public static void main(String[] args) {
List<GenericObject> list = new ArrayList<>();
list.add(new GenericObject(new TreeSet<>(Arrays.asList(2, 3, 4))));
list.add(new GenericObject(new TreeSet<>(Arrays.asList(1, 2))));
list.add(new GenericObject(new TreeSet<>(Arrays.asList(4, 5))));
list.add(new GenericObject(new TreeSet<>(Arrays.asList(2, 3))));
list.sort(new Comparator<GenericObject>() {
@Override
public int compare(GenericObject o1, GenericObject o2) {
String o1String = o1.orderNumbers.stream()
.map(Object::toString)
.reduce("", String::concat);
String o2String = o2.orderNumbers.stream()
.map(Object::toString)
.reduce("", String::concat);
return o1String.compareTo(o2String);
}
});
System.out.println(list);
}
@Override
public String toString() {
return "GenericObject [orderNumbers=" + orderNumbers + "]";
}
}
输出:
[GenericObject [orderNumbers=[1, 2]], GenericObject [orderNumbers=[2, 3]], 通用对象 [orderNumbers=[2, 3, 4]], 通用对象 [订单号=[4, 5
]]]