首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java \ groupingBy相同的元素

Java \ groupingBy相同的元素
EN

Stack Overflow用户
提问于 2015-04-29 14:38:39
回答 2查看 7.1K关注 0票数 9

我有一个词流,我想根据相同元素的出现对它们进行排序(= words )。

例如:{你好,世界,你好}

代码语言:javascript
复制
Map<String, List<String>>

你好,{hello,hello}

世界,{世界}

到目前为止我所拥有的是:

代码语言:javascript
复制
Map<Object, List<String>> list = streamofWords.collect(Collectors.groupingBy(???));

问题1:流似乎丢失了他正在处理String的信息,因此编译器迫使我将类型更改为Object,List

问题2:我不知道该把什么放在亲子里,按照同样的情况来分组。我知道我能够处理lambda表达式中的单个元素,但是我不知道如何到达“外部”每个元素来检查是否相等。

谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-04-29 14:45:33

您正在搜索的KeyExtractor是identity函数:

代码语言:javascript
复制
Map<String, List<String>> list = streamofWords.collect(Collectors.groupingBy(Function.identity()));

编辑补充说明:

  • Function.identity()用一个只返回它得到的参数的方法来复述一个‘函数’。
  • Collectors.groupingBy(Function<S, K> keyExtractor)提供一个收集器,它将流的所有元素收集到一个Map<K, List<S>>中。它使用keyExtractor实现来检查流的S类型的对象,并从中推断出K类型的键。此键是映射的键,用于获取(或创建)添加流元素的结果映射中的列表。
票数 8
EN

Stack Overflow用户

发布于 2018-11-21 10:45:34

如果您想按对象的某些字段(而不是整个对象)进行分组,并且不想更改等于和hashCode方法,那么我将创建一个包含一组键的类,用于分组:

代码语言:javascript
复制
import java.util.Arrays;

@Getter
public class MultiKey {

    public MultiKey(Object... keys) {
        this.keys = keys;
    }

    private Object[] keys;

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        MultiKey multiKey = (MultiKey) o;
        return Arrays.equals(keys, multiKey.keys);
    }

    @Override
    public int hashCode() {
        return Arrays.hashCode(keys);
    }

}

groupingBy本身:

代码语言:javascript
复制
Map<MultiKey, List<VhfEventView>> groupedList = list
        .stream()
        .collect(Collectors.groupingBy(
                 e -> new MultiKey(e.getGroupingKey1(), e.getGroupingKey2())));
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29946938

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档