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

bqucvtff  于 2024-01-05  发布在  Java
关注(0)|答案(4)|浏览(190)

此问题在此处已有答案

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

  1. public static void main(String[] args) {
  2. List<String> l = Arrays.asList("A", "C", "B", "A", "B");
  3. Map<String, List<String>> b = l.stream().collect(Collectors.groupingBy(Function.identity()));
  4. System.out.println(b.toString());
  5. }

字符串
返回{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中。
  1. record Pair(String letter, int index) {
  2. @Override
  3. public String toString() {
  4. return "(%s, %d)".formatted(letter, index);
  5. }
  6. }
  7. List<String> l = Arrays.asList("A", "C", "B", "A", "B");
  8. Map<String, List<Pair>> result = IntStream.range(0, l.size())
  9. .mapToObj(i -> new Pair(l.get(i), i))
  10. .collect(Collectors.groupingBy(Pair::letter));
  11. result.entrySet().forEach(System.out::println);

字符串
指纹

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


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

展开查看全部
mmvthczy

mmvthczy2#

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

  1. Map<String, List<String>> b = IntStream.range(0, l.size())
  2. .boxed()
  3. .collect(Collectors.groupingBy(
  4. l::get,
  5. Collectors.mapping(
  6. index -> "(" + l.get(index) + "," + index + ")",
  7. Collectors.toList()
  8. )
  9. ));

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

jk9hmnmh

jk9hmnmh3#

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

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

字符串

输出

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


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

编辑

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

  1. @AllArgsConstructor
  2. class MyOutput{
  3. private String letter;
  4. private Integer index;
  5. @Override
  6. public String toString() {
  7. return "(" + letter + "," + index + ')';
  8. }
  9. }


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

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

产出

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

展开查看全部
gfttwv5a

gfttwv5a4#

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

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

字符串
输出量:

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

相关问题