java 使用Stream API删除列表中的项目[重复]

bqucvtff  于 12个月前  发布在  Java
关注(0)|答案(4)|浏览(155)

此问题在此处已有答案

Java 8, Stream of Integer, Grouping indexes of a stream by the Integers?(4个回答)
7天前关闭
这篇文章是编辑并提交审查6天前.
我正在尝试使用Stream对列表中的项目进行分组。

public static void main(String[] args) {
    List<String> l = Arrays.asList("A", "C", "B", "A", "B");

    Map<String, List<String>> b = l.stream().collect(Collectors.groupingBy(Function.identity()));
    System.out.println(b.toString());
}

字符串
返回{A=[A, A], B=[B, B], C=[C]}
我怎样才能得到每个元素的索引呢?像这样,{A=[(A,0), (A,3)], B=[(B,2), (B,4)], C=[(C,1)]}
这个问题与this问题不同,在this问题中,他们只想要索引,但我想要索引和列表项。

e5nqia27

e5nqia271#

这里是如何做你想要的。

  • 首先,声明一个记录来保存数据。
  • 然后流式传输信息并创建该记录的示例。
  • 然后使用groupingBy将其分组到map中。
record Pair(String letter, int index) {
    @Override
    public String toString() {
        return "(%s, %d)".formatted(letter, index);
    }
}

List<String> l = Arrays.asList("A", "C", "B", "A", "B");

Map<String, List<Pair>> result = IntStream.range(0, l.size())
        .mapToObj(i -> new Pair(l.get(i), i))
        .collect(Collectors.groupingBy(Pair::letter));

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

字符串
指纹

A=[(A, 0), (A, 3)]
B=[(B, 2), (B, 4)]
C=[(C, 1)]


使用记录允许您在从Map中检索记录后使用记录的getter检索每个元素。

mmvthczy

mmvthczy2#

您需要按照这样的顺序专门Map元素。下面是您需要输出的代码。

Map<String, List<String>> b = IntStream.range(0, l.size())
            .boxed()
            .collect(Collectors.groupingBy(
                    l::get,
                    Collectors.mapping(
                            index -> "(" + l.get(index) + "," + index + ")",
                            Collectors.toList()
                    )
            ));

字符串
输出为:{A=[(A,0),(A,3)],B=[(B,2),(B,4)],C=[(C,1)]}
如果有帮助,请投赞成票并标记为正确。

jk9hmnmh

jk9hmnmh3#

您可以像这样将groupingByList::get(int index)一起使用:

Map<String, List<Integer>> result = IntStream.range(0, l.size())
        .boxed()
        .collect(Collectors.groupingBy(l::get));

字符串

输出

{A=[0, 3], B=[2, 4], C=[1]}


正如您所看到的,响应与您预期的略有不同。我认为显示(B,2)是多余的。

编辑

由于OP坚持显示相同的输出,我建议创建一个自定义对象,包含一个字母和索引,如下所示:

@AllArgsConstructor
class MyOutput{
    private String letter;
    private Integer index;

    @Override
    public String toString() {
        return "(" + letter + "," + index + ')';
    }
}


你的流应该看起来像这样:

Map<String, List<MyOutput>> response = IntStream.range(0, l.size())
        .boxed()
        .collect(groupingBy(l::get, mapping(i -> new MyOutput(l.get(i), i), toList())));

产出

{A=[(A,0), (A,3)], B=[(B,2), (B,4)], C=[(C,1)]}

gfttwv5a

gfttwv5a4#

使用streaming和groupingBy得到了这个解决方案。

Map<String, List<Map.Entry<String, Integer>>> data = IntStream.range(0, l.size())
                .mapToObj(i -> Map.entry(l.get(i), i))
                .collect(Collectors.groupingBy(Map.Entry::getKey,
                        Collectors.mapping(Function.identity(), Collectors.toList())));
System.out.println(data);

字符串
输出量:

{A=[A=0, A=3], B=[B=2, B=4], C=[C=1]}

相关问题