我是Java的长期开发人员,但对如何执行以下操作感到好奇,尽管我确信它是可行的,但我还没有找到使用Java 8在线完成的类似操作。
说我有一个对象列表,列表中的每个对象都有一个名称。可能有三个名称:“ Jack”,“ Terry”,“ Jon”,虽然有100个对象。 在Java 8中,用一行代码,如何对数组进行“排序”,以使所有Terry都在首位,然后是所有Jacks,然后是所有Jons?
答案 0 :(得分:1)
使用列表定义排序顺序是不正确的。否则,这与Pankaj Singhal的建议相同:
Map<String,Integer> order = Map.of("Terry", 0, "Jack", 1, "Jon", 2);
sortedList = list.stream()
.sorted(Comparator.comparing(i -> order.getOrDefault(i.getName(), MAX_VALUE)))
.collect(toList());
或者,如果需要就地排序:
Collections.sort(list, Comparator.comparing(i -> order.getOrDefault(i.getName(), MAX_VALUE)));
答案 1 :(得分:0)
这是三元组的解决方案:
names.sort((a, b) ->
a.name.equals("Terry") ? -1 :
b.name.equals("Terry") ? 1 :
a.name.compareTo(b.name)
);
说明
如果a
或b
为"Terry"
,则无论哪种排序都较小。自然地对其他所有内容进行排序。在a
和b
和"Terry"
的情况下,可以对较小的任意一个排序(在这种情况下为a
),这会使它成为不稳定的排序。
样本副本here。
答案 2 :(得分:0)
以下列表代表排序顺序:
List<String> sortOrder = Arrays.asList("Terry","Jack","Jon");
我们可以对元素进行如下排序:
MyClass[] sorted = Arrays.stream(initial)
.sorted(Comparator.comparingInt(o -> sortOrder.indexOf(o.name)))
.toArray(MyClass[]::new);
输出:
[Terry, Terry, Terry, Jack, Jon, Jon]