如何仅使用数组在Java中只打印一次重复的元素?

如何仅使用数组在Java中只打印一次重复的元素?,java,arrays,Java,Arrays,下面的代码片段仅适用于重复的数字,但我很好奇如何使用多个重复元素来解决它 输入:1,2,5,5,5,8,9,11,12,1 输出:1,5 int[] arr = {1, 2, 5, 5, 5, 8, 9, 11, 12, 1}; for (int i = 0; i < arr.length; i++) { for (int j = i + 1; j < arr.length; j++) { if (arr[i] == arr[j] && i

下面的代码片段仅适用于重复的数字,但我很好奇如何使用多个重复元素来解决它
输入:
1,2,5,5,5,8,9,11,12,1

输出:
1,5

int[] arr = {1, 2, 5, 5, 5, 8, 9, 11, 12, 1}; 
for (int i = 0; i < arr.length; i++) {
    for (int j = i + 1; j < arr.length; j++) {
        if (arr[i] == arr[j] && i != j) {                  
            System.out.print(arr[j] + " ");
        }
    }
}
int[]arr={1,2,5,5,8,9,11,12,1};
对于(int i=0;i
int[]arr={1,2,5,5,5,8,9,11,12,1};
Map Map=newhashmap();
Arrays.stream(arr.forEach)(i->map.put(i,map.getOrDefault(i,0)+1));
map.keySet().stream().mapToInt(i->i).filter(i->map.get(i)>1)
.forEachOrdered(System.out::println);
您可以使用映射来存储频率,然后获取频率大于
1

的数字。这样如何:

int[] arr = { 1, 2, 5, 5, 5, 8, 9, 11, 12, 1 };

boolean[] seen = new boolean[arr.length];

for (int i = 0; i < arr.length; i++)
{
    if(seen[i]) continue;

    boolean duplicate = false;
    for (int j = i + 1; j < arr.length; j++)
    {
        if (arr[i] == arr[j])
        {
            duplicate = seen[j] = true;
        }
    }
    if(duplicate) 
        System.out.print(arr[i] + " ");
}

可以使用集合(线性时间复杂度)一次性完成


您可以使用流API执行此操作,如下所示:

import java.util.Arrays;
import java.util.Collections;
import java.util.stream.Stream;

public class Main {
    public static void main(String[] args) {
        Integer[] arr = { 1, 2, 5, 5, 5, 8, 9, 11, 12, 1 };
        Stream.of(arr).distinct().filter(n -> Collections.frequency(Arrays.asList(arr), n) > 1)
                .forEach(System.out::println);
    }
}
输出:

1
5

这里有一个使用地图的简单方法

  • 使用键的值和值的计数
  • 只需计算出现次数,并仅在计数=2时打印值

@用户没有编译或执行要求的操作。为什么输出中有
1
?它不会超过两次。@JanezKuhar好吧,如果
forEach
拼写正确的话就会有。@HarshalParekh我编辑了我的问题,很抱歉让人困惑。谢谢你的解决方案(+1)它非常强大,但是我很好奇如何只使用数组来解决它。这个解决方案或我的解决方案实际上比两个嵌套循环要好
(O(n)vs O(n^2))
。你完全正确,但我想看看如何仅使用数组来解决它,因为我在问题中拉伸了它:)
public static void getRepeatedValues(int[] values)
    {
        Set<Integer> set = new HashSet<>();
        Set<Integer> ans = new HashSet<>();

        for (int value : values)
        {
            if(set.contains(value))
            {
                ans.add(value);
            } else {
                set.add(value);
            }
        }
        System.out.println(ans);
    }
Input:
[1, 2, 5, 5, 5, 8, 9, 11, 12, 1]
Output:
[1, 5]
import java.util.Arrays;
import java.util.Collections;
import java.util.stream.Stream;

public class Main {
    public static void main(String[] args) {
        Integer[] arr = { 1, 2, 5, 5, 5, 8, 9, 11, 12, 1 };
        Stream.of(arr).distinct().filter(n -> Collections.frequency(Arrays.asList(arr), n) > 1)
                .forEach(System.out::println);
    }
}
1
5
int[] arr = { 1, 2, 5, 5, 5, 8, 9, 11, 12, 1 };

Map<Integer, Integer> dups = new HashMap<>();

for (int i : arr) {
    if (dups.compute(i,(k,v)-> v == null ? 1 : v + 1) == 2) {
            System.out.print(i + " ");
    }
}
System.out.println();
5 1