如何对包含整数TreeSet的泛型对象列表进行排序
嘿,这个需求很好实现!咱们可以利用TreeSet本身的升序有序特性,再结合Java的Comparator接口来定制排序逻辑,完全匹配你给出的示例顺序要求。
核心思路
因为TreeSet<Integer>本身是按整数自然升序排列的,所以我们可以通过以下逻辑比较两个GenericObject:
- 逐个遍历两个集合的元素,按升序比较,第一个出现差异的元素直接决定两个对象的顺序;
- 如果其中一个集合是另一个的前缀子集(比如
[2,3]和[2,3,4]),那么元素数量更少的对象排在前面。
完整代码实现
首先是你的GenericObject类,我加了构造方法和toString方便测试:
import java.util.*; class GenericObject { Set<Integer> orderNumbers = new TreeSet<>(); // 构造方法:快速初始化orderNumbers public GenericObject(Integer... numbers) { this.orderNumbers.addAll(Arrays.asList(numbers)); } // 重写toString,方便打印结果 @Override public String toString() { return orderNumbers.toString(); } }
然后是排序的核心逻辑和测试代码:
public class SortGenericObjects { public static void main(String[] args) { // 初始化测试列表 List<GenericObject> objectList = new ArrayList<>(); objectList.add(new GenericObject(2, 3, 4)); objectList.add(new GenericObject(1, 2)); objectList.add(new GenericObject(4, 5)); objectList.add(new GenericObject(2, 3)); // 定义排序比较器 Comparator<GenericObject> setBasedComparator = (obj1, obj2) -> { Iterator<Integer> iter1 = obj1.orderNumbers.iterator(); Iterator<Integer> iter2 = obj2.orderNumbers.iterator(); // 逐个比较元素 while (iter1.hasNext() && iter2.hasNext()) { int num1 = iter1.next(); int num2 = iter2.next(); if (num1 != num2) { return Integer.compare(num1, num2); } } // 若一个是另一个的子集,短的排前面 return Integer.compare(obj1.orderNumbers.size(), obj2.orderNumbers.size()); }; // 执行排序(两种方式选其一即可) // 方式1:用Collections.sort Collections.sort(objectList, setBasedComparator); // 方式2:用Stream API(Java 8+) // List<GenericObject> sortedList = objectList.stream() // .sorted(setBasedComparator) // .collect(Collectors.toList()); // 打印排序结果 for (int i = 0; i < objectList.size(); i++) { System.out.printf("%d) %s%n", i + 1, objectList.get(i)); } } }
运行结果
执行后会输出:
1) [1, 2] 2) [2, 3] 3) [2, 3, 4] 4) [4, 5]
完全符合你想要的排序顺序!
补充说明
- 这里依赖
TreeSet的有序性,迭代时会按整数升序返回元素,所以比较逻辑是有效的;如果换成无序的HashSet,这个方法就不适用了,因为迭代顺序不确定。 - 如果你需要降序排序,只需要把
Integer.compare(num1, num2)改成Integer.compare(num2, num1),同时子集比较的部分也反过来即可。
内容的提问来源于stack exchange,提问作者abeld89
相关产品推荐
相关产品推荐

