【问题标题】:Stream grouping by sum of determinate objects按确定对象的总和进行流分组
【发布时间】:2018-12-10 14:12:39
【问题描述】:

我有一个这样的请求类:

public class Request 
{
String name,destName;
int nSeats;
//Example : requestOne,Paris,3
...
}

我想将请求分组到一个 Map |Integer,List of String|其中键是具有相同 destName 的请求的总和,值是目标名称。

这是我的代码:

public TreeMap<Integer, List<String>> destinationsPerNSeats() {
return requests.
stream().
collect(Collectors.groupingBy(Request::getnSeats, TreeMap::new, 
Collectors.mapping(Request::getDestName, Collectors.toList()))).
}

输入:

TreeMap<Integer, List<String>> map = mgr.destinationsPerNSeats();
print(map);

输出:{4=[Paris], 3=[London, Berlin, Berlin], 2=[Paris]}

预期输出:{6=[Berlin, Paris], 3=[London]}

我该如何解决这个问题?谢谢!

【问题讨论】:

  • 你用什么作为输入?
  • 输入是什么?

标签: dictionary java-8 java-stream treemap collectors


【解决方案1】:

我认为您需要两个 Stream 管道。第一个将目的地分组并对每个目的地名称的座位总数求和,第二个将按座位数对目的地名称进行分组:

public TreeMap<Integer, List<String>> destinationsPerNSeats() {
    return
        requests.stream()
                .collect(Collectors.groupingBy(Request::getDestName, 
                                               Collectors.summingInt(Request::getnSeats)))
                .entrySet()
                .stream()
                .collect(Collectors.groupingBy(Map.Entry::getValue,
                                               TreeMap::new,
                                               Collectors.mapping(Map.Entry::getKey,Collectors.toList())));
}

使用以下输入测试您的代码:

List<Request> requests = new ArrayList<> ();
requests.add (new Request("John","Paris",4));
requests.add (new Request("Ben","London",3));
requests.add (new Request("Dan","Berlin",3));
requests.add (new Request("Sara","Berlin",3));
requests.add (new Request("Jenn","Paris",2));

产生Map:

{3=[London], 6=[Berlin, Paris]}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-03
    • 2022-12-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多