所以我有一个像这样的列表 ['A', 'Z', 'D', 'E', 'B', 'H', 'C'],我做了一些事情(这个事情是为了目的这个问题不可改变)我得到 [{id:D, num:5},{id:A,num:5}, {id:C,num:3}, {id:Z,num:3} ] 我想保留它按 num 字段排序的事实,并且返回总是已经按 num 字段排序。但现在我想在该排序中进行排序以保留原始列表顺序,以便我想要的输出是:
[{id:A, num:5},{id:D,num: 5},{id:Z, num:3},{id: C, num:3}]
我不太擅长 fluentiterables/guava 等,但我觉得这些是可行的方法。谁能给我一个具体的例子?
最佳答案
为了使用预定义列表作为排序顺序,有 Ordering.explicit(List)
.您可以将其与 Ordering.onResultOf(Function)
结合使用按 id 字段对输出列表进行排序。
要将按 num 字段排序与按 id 字段排序组合,您可以使用 Ordering.compound(Comparator)
.
因此,所需的 Ordering
实例的完整定义大致如下所示:
Ordering.natural().onResultOf(extractNumFunction)
.compound(Ordering.explicit(inputList).onResultOf(extractIdFunction))
也许您需要添加泛型类型信息。
然后您可以使用此 Ordering
实例作为 Collections.sort(List, Comparator)
的参数,或使用类似 Ordering.sortedCopy(Iterable)
的方法.
关于JAVA Guava /集合: How to use a predefined list as a predicate to sort another list by?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31617800/