当前位置: 首页 > 知识库问答 >
问题:

Java 8在包含字符串列表的对象内进行流分组

董权
2023-03-14
Map<Tag, List<String>> tagPersonListMap = new HashMap<>();
for (Person person: personList) {
    List<Tag> tags = person.getTags();
    String id = person.getId();
    for(Tag tag: tags) {
        tagPersonListMap.computeIfAbsent(tag, k ->new ArrayList<>()).add(id);
    }
}
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

class Scratch {
    public static void main(String[] args) {
        Person person1 = new Person(Arrays.asList(Tag.EMPLOYEE, Tag.UNKNOWN), "123");
        Person person2 = new Person(Arrays.asList(Tag.UNKNOWN, Tag.VISITOR), "345");
        Person person3 = new Person(Arrays.asList(Tag.VISITOR), "678");
        Person person4 = new Person(Arrays.asList(Tag.EMPLOYEE, Tag.UNKNOWN), "910");
        List<Person> personList = Arrays.asList(
            person1, person2,
            person3, person4
        );

        Map<Tag, List<String>> tagPersonListMap = new HashMap<>();
        for (Person person: personList) {
            List<Tag> tags = person.getTags();
            String id = person.getId();
            for(Tag tag: tags) {
                tagPersonListMap.computeIfAbsent(tag, k ->new ArrayList<>()).add(id);
            }
        }

        System.out.println("Final result: " + tagPersonListMap);
    }
}

enum Tag {
    EMPLOYEE("employee"),
    VISITOR("visitor"),
    UNKNOWN("unknown");
    private final String mValue;
    private Tag(String value) {
        this.mValue = value;
    }
}

class Person {
    List<Tag> tags;
    String id;

    Person (List<Tag> tag, String i) {
        tags = tag;
        id = i;
    }

    List<Tag> getTags() {
        return tags;
    }

    String getId() {
        return id;
    }
}

预期产出

Final result: {EMPLOYEE=[123, 910], UNKNOWN=[123, 345, 910], VISITOR=[345, 678]}

共有1个答案

谢财
2023-03-14

你可以这样做。为了实现这一点,我基本上将标记列表和id转换为(tag tag,String id)map.entry对象。所以如果有四个标签和一个Id,那就是四个条目。然后,我简单地按标记将它们分组,其值为列表

Map<Tag, List<String>> result = personList.stream()
        .flatMap(per -> per.getTags().stream()
                .map(tag -> Map.entry(tag, per.getId())))
                .collect(Collectors.groupingBy(Entry::getKey,
                        Collectors.mapping(Entry::getValue,
                                Collectors.toList())));

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

印刷品

UNKNOWN=[123, 345, 910]
EMPLOYEE=[123, 910]
VISITOR=[345, 678]

做了这件事,我仍然会坚持你所拥有的。有时,使用溪流就像用大锤钉钉子。

 类似资料:
  • 问题内容: 我正在尝试对字符串列( 包含数字 )进行排序。 您会看到Mysql的自然排序算法放在后面( 对于大多数应用程序来说都可以 ),但是我有独特的需求,因此我希望结果应该像这样排序。 仅使用SQL 是否可能,或者我必须在应用程序级别操纵结果集? 问题答案: 继续 假设 它始终为WORD_space_NUMBER,这应该可行: 使用POSITION查找空间,使用SUBSTRING捕获其后的数字

  • 我有一个字符串数组,中间有一个空白。我想根据空白之前的第一个子字符串对内容进行排序,然后根据空白之后的子字符串对内容进行排序。 例如,如果我的数组如下所示:,那么最后我需要。 我尝试在下面实现一个新的比较器: 但是我得到了这个错误: MyClass。java:7:错误:找不到合适的排序方法(字符串[], 这个错误听起来像是集合框架不支持排序字符串,这没有多大意义。

  • 示例: 我们的名单上有5个名字:凯文、汉斯、弗里茨、汉·索罗、彼得 我现在想要所有在顶部包含“han”的名字。 因此排序后的列表如下所示: Hans,Han Solo,Kevin,Fritz,Peter 到目前为止我所尝试的: 什么都没有,因为我没有线索,但我已经谷歌了,没有找到任何东西。 从列表中删除/添加项目不是一个选项,因为我正在使用(ControlsFX组件)中的列表,其中每个项目都具有会

  • 问题内容: 我有一个具有以下格式的字符串列表: …,我想根据零件的字母顺序对列表进行排序。我将如何去做呢? 问题答案: 要更改排序键,使用的参数: 与以下方法相同: 请注意,如问题中所述,这将是字母排序,因此对于2位数字的组件,它不会将它们解释为数字,例如,“ 11”将出现在“ 2”之前。

  • 两行的一个例子是:([a,b,c],d)和([d,e],a)我想把这些行转换成([a,b,c],[d,e])和([d,e],[a,b,c]) dataframe的列名是“src”和“dst”。 我如何处理这个问题?

  • 我有“MainClass”类的对象列表,它包含“Question”类的对象列表,它包含Option类的对象列表。如何按“Id”对“MainClass”类列表进行排序,以及按“Id”对“Option”类列表进行排序? 假设,