繁体   English   中英

如何根据薪水对员工 object 进行排序,姓名从 Map 升序排列<string, map<string, arraylist<employee> &gt;&gt;使用 Java8 流 API</string,>

[英]How to sort Employee object based on salary,name in ascending order from Map<String, Map<String, ArrayList<Employee>>>using Java8 streams API

Map<String, Map<String, ArrayList<Employee>>> map = new HashMap<String, Map<String, ArrayList<Employee>>>();
ArrayList<Employee> list = new ArrayList<Employee>();
Map<String, ArrayList<Employee>> empMap = new HashMap<>();

Employee e1 = new Employee("Raju", 10000);
Employee e2 = new Employee("Naresh", 2000);
Employee e3 = new Employee("Sugg", 30000);
Employee e4 = new Employee("Asd", 30000);
list.add(e1);
list.add(e2);
list.add(e3);
list.add(e4);
empMap.put("w1", list);

map.put("t1", empMap);

Comparator<Employee> cmp = (i1, i2) -> i1.getSal().compareTo(i2.getSal());
Comparator<Employee> cmp1 = (i1, i2) -> i1.getName().compareTo(i2.getName());

map.values().stream().map(m -> {
    return m.values().stream().map(l -> {
        l.sort(cmp.thenComparing(cmp1));
        return l;
    });
}).flatMap(m -> m).forEach(l -> {
    l.forEach(l1 -> System.out.println(l1.getName() + " " + l1.getSal()));
});

Map 是主 object,empMap 是 map 里面的主 Z1D78DC8ED51214E518B5114E518B5114FE2449 员工名单。 我尝试了上面的排序,但是上面的代码还有其他方法可以优化吗?

如果您只想对Map中的ArrayList<Employee>进行排序,您可以使用forEach来迭代 map 并在ArrayList上使用排序方法

 map.forEach((key,value)->{
        value.forEach((nKey,nValue)->{
            nValue.sort(Comparator.comparing(Employee::getSalary).thenComparing(Employee::getName));
        });
    });

您已经创建了两个Comparator函数 - 这是一种很好的方法和实践,此外您可以更改代码的最后一部分 - 它看起来有点混乱:

    map.values().stream()
            .flatMap(m -> m.values().stream())
            .forEach(l -> l.sort(cmp.thenComparing(cmp1)));

或者

map.forEach((key,value)-> 
            value.values()
            .forEach(v -> v.sort(cmp.thenComparing(cmp1))));

如果您想要一个完整的流解决方案,您可以按如下方式进行。 这只是将 entrySets in的每个外部out和内部流出,并根据指定的要求对列表进行排序。 我添加了一个具有不同薪水的重复名称以进行完整的演示。

Map<String, Map<String, List<Employee>>> results = map
        .entrySet().stream()
        .collect(Collectors.toMap(out -> out.getKey(),
                out -> out.getValue().entrySet().stream()
                        .collect(Collectors.toMap(
                                in -> in.getKey(),
                                in -> in.getValue().stream()
                                        .sorted(Comparator
                                                .comparing(
                                                        Employee::getName)
                                                .thenComparing(
                                                        Employee::getSalary))
                                        .collect(Collectors
                                                .toList())))));

results.entrySet().forEach(System.out::println);

印刷

t1={w1=[[Asd,  30000], [Naresh,  2000], [Naresh,  10000], [Raju,  10000], [Sugg,
  30000]]}

当然,由于List本身是可变的,因此更直接地按照其他答案中的描述对列表进行排序,而不是创建新的 map。

暂无
暂无

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

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