[英]Java How order a list of objects with sets of integers
我有一个带有一些属性的通用对象的列表,其中一个是整数的Set(treeSet)。
class GenericObject{
Set<Integer> orderNumbers = new TreeSet<>();
Other attributes...
}
我想订购此通用对象列表,并比较Set ...示例:
我的实际列表清单;
带有Set的GenericObject-> 2,3,4
带有Set的GenericObject-> 1,2
带有Set的GenericObject-> 4,5
带有Set的GenericObject-> 2,3
我想要订购这样的对象列表:
1)1,2
2)2,3
3)2,3,4
4)4,5
我正在尝试实现GenericObject的比较器,并覆盖比较方法,但是我没有。
谢谢,我会等你的答案
由于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
您将必须GenericObject
Comparator
Set
包含的Integer。
您应该依靠Integer可比方法,但对于特定情况(相同元素,但又有一个附加元素),应将具有较少元素的集合放置在顺序的前面。
就时间而言,它应该是最直接有效的方法。
如果不需要性能(很少的列表和很少的元素),则可以将String
的List的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]],GenericObject [orderNumbers = [2、3、4]],GenericObject [orderNumbers = [4、5]]]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.