在Java中找到数组中的重复值

时间:2019-01-24 14:48:15

标签: java arrays

我的代码中有一个方法可以识别数组中的重复值,但是问题是当我输入3个或更多重复值时,程序将出现错误。

public static void main(String[] args) {

    Scanner input = new Scanner(System.in);
    System.out.print("Enter How many number: ");
    int user = input.nextInt();
    int array[] = new int[user];
    for (int x = 0; x < user; x++) {
        System.out.print("Enter number:");
        array[x] = input.nextInt();
    }

    System.out.print("Mode is ");
    getMode(array);
}


protected static void getMode(int[] numbers) {
    for (int i = 0; i < numbers.length; i++) {
        for (int j = i + 1; j < numbers.length; j++) {
            if (numbers[i] == numbers[j]) {
                System.out.print(numbers[i]);
            }
        }
    }
}

输入多少个数字:5 InputNumber1:1

InputNumber2:1

InputNumber3:1

InputNumber4:2

InputNumber5:2

我希望输出为“模式为12”,但实际输出为“模式为1112”

5 个答案:

答案 0 :(得分:0)

您没有将重复项放在某处。如果这样做,您可以按照

的方式检查当前值是否与重复项相同。
 if (numbers[i] == numbers[j]) {
     if (numbers[i] is not in duplicate list) {
         System.out.print(numbers[i]);
         addToDupeList(numbers[i];
         }
     }

我建议使用List来快速添加并检查重复项,但是由于您使用的是固定数组,因此您需要添加第三个循环,以检查重复项列表中的当前值。

答案 1 :(得分:0)

您应该检查dupeList是否包含要作为参数传递的数字。相反,我建议您使用Set而不是List。

基本上,您可以像这样实现addToDupeSet方法:

private Set<Integer> dupeSet = new HashSet();

private void addToDupeSet(int number){
   dupeSet.add(number);
}

那样,dupeSet的值将不会超过一次。

答案 2 :(得分:0)

在您的程序中,您正在重新访问重复的号码。这就是您的程序在模式下提供重复项的原因。 您需要维护一个访问数组,以免再次访问重复的数字。 您需要做的是这样的:

protected static void getMode(int[] numbers) {
    boolean[] visited = new boolean[numbers.length];
    Integer mode;
    for (int i = 0; i < numbers.length; i++) {
        if(!visited[i]){
            visited[i] = true;
            mode = null;
            for (int j = i + 1; j < numbers.length; j++) {
                if (numbers[i] == numbers[j]) {
                    visited[j] = true;
                    mode = numbers[i];
                }
            }
            if(mode != null){
                System.out.print(mode);
            }
        }
    }
}

希望这会有所帮助!

答案 3 :(得分:0)

基本上在这里应该这样实现 在getMode()方法中。

Set<Integer> set1 = new HashSet<>();
                for (int i = 0; i < num.length; i++) {
                    set1.add(num[i]);
                }
                set1.stream().forEach(System.out::print);

答案 4 :(得分:0)

如果我们使用2个for循环再次迭代剩余的数组值,则时间复杂度将为O(n * n),这不是用于大数据的好方法。以下情况将具有O(n)时间复杂度。

  1. 作为Set接口及其实现不允许添加重复的值,并且如果我们尝试添加重复值,则add方法将返回false,因此可用于增加该数字的计数。
  2. 计数是int数组中数字出现的次数。要打印数字及其重复,我们需要在地图中放置一个数字并计数。
  3. 使用Java8 Lambda表达式,我们可以将它们简单地显示在一行中。
protected static void getMode(int[] numbers) {

        int[] arr = { 1, 3, 23, 11, 44, 3, 23, 2, 3 };
            HashMap<Integer, Integer> map = new HashMap<Integer, Integer>();
            Set<Integer> set = new HashSet<Integer>();
            for (int i = 0; i < arr.length; i++) {
                int count = 1;
                if (!(set.add(arr[i]))) {
                    count++;
                    map.put(arr[i], count);
                }
            }

            map.forEach((k, v) -> System.out.println(k + " & " + v));
        }

`