如何使用Java流API获取所有重复元素的索引

发布于 2025-02-13 15:01:29 字数 690 浏览 1 评论 0原文

如何使用Java流API获取所有重复元素的索引?

例如,我们有:

List<Integer> input =
        new ArrayList<>(Arrays.asList(312, 312, 195, 195, 195, 851, 335, 851, 99));

我可以将类似的元素分组:

result = input.stream().collect(Collectors.groupingBy(input::indexOf))
//result = {0=[312, 312], 2=[195, 195, 195], 5=[851, 851], 6=[335], 8=[99]}

但是我想得到这样的结果:

{312=[0, 1], 195=[2, 3, 4], 851=[5, 7]}

或者这样:

(0,1,2,3,4,5,7)

我该怎么做?

How can I get the indexes of all duplicate elements by using the Java stream API?

For example, we have:

List<Integer> input =
        new ArrayList<>(Arrays.asList(312, 312, 195, 195, 195, 851, 335, 851, 99));

I could group same elements like this:

result = input.stream().collect(Collectors.groupingBy(input::indexOf))
//result = {0=[312, 312], 2=[195, 195, 195], 5=[851, 851], 6=[335], 8=[99]}

But I want get a result like this:

{312=[0, 1], 195=[2, 3, 4], 851=[5, 7]}

or just like this:

(0,1,2,3,4,5,7)

How can I do this?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

影子是时光的心 2025-02-20 15:01:29

您可以使用intstream

Map<Integer, List<Integer>> map = IntStream.range(0, input.size())
                .boxed()
                .collect(Collectors.groupingBy(i -> input.get(i), HashMap::new,
                        Collectors.toCollection(ArrayList::new)));

// output : {99=[8], 851=[5, 7], 195=[2, 3, 4], 312=[0, 1], 335=[6]}

拥有所有值及其索引后,您可以简单地滤除具有超过1个值的条目。

完整示例:

Map<Integer, List<Integer>> map = IntStream.range(0, input.size())
                .boxed()
                .collect(Collectors.groupingBy(i -> input.get(i), HashMap::new,
                        Collectors.toCollection(ArrayList::new)))
                .entrySet()
                .stream()
                .filter(e -> e.getValue().size()>1)
                .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));

You can Use IntStream

Map<Integer, List<Integer>> map = IntStream.range(0, input.size())
                .boxed()
                .collect(Collectors.groupingBy(i -> input.get(i), HashMap::new,
                        Collectors.toCollection(ArrayList::new)));

// output : {99=[8], 851=[5, 7], 195=[2, 3, 4], 312=[0, 1], 335=[6]}

Once you have all the values and their indexes you can simply filter out the entries which have more than 1 value.

Full example:

Map<Integer, List<Integer>> map = IntStream.range(0, input.size())
                .boxed()
                .collect(Collectors.groupingBy(i -> input.get(i), HashMap::new,
                        Collectors.toCollection(ArrayList::new)))
                .entrySet()
                .stream()
                .filter(e -> e.getValue().size()>1)
                .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
追星践月 2025-02-20 15:01:29

使用collections.fquency的另一种方法

int[] dupIndexes = IntStream.range(0, input.size())
                            .filter(i -> Collections.frequency(input, input.get(i)) > 1)
                            .toArray();

Another approach using Collections.frequency

int[] dupIndexes = IntStream.range(0, input.size())
                            .filter(i -> Collections.frequency(input, input.get(i)) > 1)
                            .toArray();
假情假意假温柔 2025-02-20 15:01:29

看起来仅通过循环就很容易解决。只需将map以输入值作为键,它是索引作为映射的值:

Set<Integer> result = new HashSet<>();
Map<Integer, Integer> map = new HashMap<>();
for (int i = 0; i < input.size(); i++) {
    if (map.containsKey(input.get(i))) {
        result.add(map.get(input.get(i)));
        result.add(i);
    } else {
        map.put(input.get(i), i);
    }
}
System.out.println(result);

输出

[0, 1, 2, 3, 4, 5, 7]

Looks like it's quite easy to solve by just for loop. Just keep a Map with input value as a key and it's index as a value of map:

Set<Integer> result = new HashSet<>();
Map<Integer, Integer> map = new HashMap<>();
for (int i = 0; i < input.size(); i++) {
    if (map.containsKey(input.get(i))) {
        result.add(map.get(input.get(i)));
        result.add(i);
    } else {
        map.put(input.get(i), i);
    }
}
System.out.println(result);

Output

[0, 1, 2, 3, 4, 5, 7]
水波映月 2025-02-20 15:01:29

您可以尝试以下代码 -

     List<Integer> input = new ArrayList<>(Arrays.asList(312, 312, 195, 195, 195, 851, 335, 851, 99));
    result = IntStream.range(0, input.size()).boxed()
            .collect(Collectors.groupingBy(input::get, HashMap::new,
                    Collectors.toList()));

You can try below code -

     List<Integer> input = new ArrayList<>(Arrays.asList(312, 312, 195, 195, 195, 851, 335, 851, 99));
    result = IntStream.range(0, input.size()).boxed()
            .collect(Collectors.groupingBy(input::get, HashMap::new,
                    Collectors.toList()));
清风无影 2025-02-20 15:01:29
    HashMap<Integer, List<Integer>> map = new HashMap<Integer, List<Integer>>();
    List<Integer> ls = null;
    for (int i = 0; i < input.size(); i++) {
        if (map.get(input.get(i)) != null) {
            ls = map.get(input.get(i));
        } else {
            ls = new ArrayList<Integer>();
        }
        ls.add(i);
        map.put(input.get(i), ls);
    }
    System.out.println(map);
    HashMap<Integer, List<Integer>> map = new HashMap<Integer, List<Integer>>();
    List<Integer> ls = null;
    for (int i = 0; i < input.size(); i++) {
        if (map.get(input.get(i)) != null) {
            ls = map.get(input.get(i));
        } else {
            ls = new ArrayList<Integer>();
        }
        ls.add(i);
        map.put(input.get(i), ls);
    }
    System.out.println(map);
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文