Java 8中基于另一列表排序时如何将未匹配元素放末尾?
解决Java 8中按指定列表排序时,未匹配元素后置的问题
问题原因
你当前使用的listA.sort(Comparator.comparingInt(listB::indexOf))会把listB中不存在的元素排在首位,是因为listB.indexOf(element)对不存在的元素返回-1,而-1小于所有存在元素的索引(从0开始),所以这些元素会被优先排序。
解决方案
修改Comparator逻辑:给listB中不存在的元素分配一个比listB最大索引更大的排序值(比如listB.size()),这样它们就会排在所有匹配元素的后面。
优化后的代码
listA.sort(Comparator.comparingInt(element -> { int index = listB.indexOf(element); return index != -1 ? index : listB.size(); }));
代码说明
- 对于listB中存在的元素,使用它在listB中的索引作为排序依据,保证和listB的顺序一致
- 对于listB中不存在的元素,用
listB.size()作为排序值(listB的最大索引是listB.size()-1),确保这些元素排在所有匹配元素之后
测试验证
以你的示例输入:
- listA = [us, au, in, gb]
- listB = [au, us, in]
排序时各元素的排序值:
- au → 0
- us → 1
- in → 2
- gb → 3(listB.size()=3)
最终排序结果为[au, us, in, gb],符合你的期望。
内容的提问来源于stack exchange,提问作者sinsanarya
相关产品推荐
相关产品推荐

