繁体   English   中英

Java 8按位置中的属性对列表进行分组

[英]Java 8 Group a List by attribute in a place

我是Java的长期开发人员,但对如何执行以下操作感到好奇,尽管我确信它是可行的,但我还没有找到使用Java 8在线完成的类似操作。

说我有一个对象列表,列表中的每个对象都有一个名称。 可能有三个名称:“ Jack”,“ Terry”,“ Jon”,虽然有100个对象。 在Java 8中,用一行代码,如何对数组进行“排序”,使得所有的Terry都将是第一个,然后是所有的Jacks,然后是所有的Jons?

使用列表定义排序顺序是不正确的。 否则,这与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)));

这是三元组的解决方案:

names.sort((a, b) -> 
    a.name.equals("Terry") ? -1 : 
    b.name.equals("Terry") ? 1 : 
    a.name.compareTo(b.name)
);

说明

如果ab"Terry" ,则排序无论如何都较小。 自然地对其他所有内容进行排序。 对于ab均为"Terry" ,可以将任意一个排序为较小的值(在这种情况下为a ),这使其成为不稳定的排序。

示例样本在这里

让以下列表代表排序顺序:

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]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM