查找数组中出现的重复项数量-Java

时间:2018-08-02 11:24:35

标签: java arrays

我无法解决这个问题。需要找到重复的,我做到了。现在剩下的就是打印重复项出现在阵列中的次数。我刚开始使用Java,因此需要对其进行硬编码才能理解。花最后两天试图弄清楚,但是没有运气。任何帮助都会很棒!谈话很便宜,这是代码。.

import java.util.Arrays;
public class LoopTest {

    public static void main(String[] args) {

        int[] array = {12,23,-22,0,43,545,-4,-55,43,12,0,-999,-87};
        int positive_counter = 0;
        int negative_counter = 0;


        for (int i = 0; i < array.length; i++) {
            if(array[i] > 0) {
                positive_counter++;
            } else if(array[i] < 0) {
                negative_counter++;
            }
        }

        int[] positive_array = new int[positive_counter];
        int[] negative_array = new int[negative_counter];

        positive_counter = 0;
        negative_counter = 0;

        for (int i = 0; i < array.length; i++) {
            if(array[i] > 0) {
                positive_array[positive_counter++] = array[i];
            } else if(array[i] < 0) {
                negative_array[negative_counter++] = array[i];
            }
        }

        System.out.println("Positive array: " + (Arrays.toString(positive_array)));
        System.out.println("Negative array: " + (Arrays.toString(negative_array)));

        Arrays.sort(array);
        System.out.println("Array duplicates: ");
        for (int i = 0; i < array.length; i++) {
            for (int j = i + 1; j < array.length; j++) {
                if(array[i] == array[j]) {                    
                    System.out.println(array[j]);
                }

            }
        }
    }
}

6 个答案:

答案 0 :(得分:2)

由于您已经在对数组进行排序,因此只需一个循环即可找到重复项(它们会紧挨着吗?)。因此,您可以执行以下操作:

            Arrays.sort(array);
            System.out.println("Array duplicates: ");
            int lastValueCount=1; //How many times we met the current value (at least 1 - this time)
            for (int i = 1; i < array.length; i++){        
                    if(array[i] == array[i-1])                     
                        lastValueCount++;   //If it is the same as the previous increase the count  
                    else {
                       if(lastValueCount>1) //If it is duplicate print it
                           System.out.println(array[i-1]+" was found "+lastValueCount+" times");
                       lastValueCount=1; //reset the counter
                    }
            }

您的数组的结果是:

Array duplicates: 
0 was found 2 times
12 was found 2 times
43 was found 2 times

此外,您还可以使用一些Java技巧,例如将值插入Map或类似的东西,但是我想您是从算法的角度来看的,因此以上只是一个循环的简单答案

答案 1 :(得分:1)

只需遍历您的解决方案,首先将正数和负数分成两个不同的数组,然后再也不使用它们,那么这种分离的目的是什么? 我只是给您一个与您的问题有关的想法,最好自行解决,以便可以使用Java。

解决方案:您可以使用Dictionary-key值对。遍历数组,将Dictionary中的元素作为键,值设置为零,在每次迭代中检查该键是否已存在于Dictionary中,只需增加其值即可。最后,所有值都是数组中重复的值。

希望它对您有帮助。

答案 2 :(得分:1)

从算法的角度来看,Veselin Davidov的答案很好(最有效)。

在生产代码中,您宁愿这样写:

Map<Integer, Long> result = 
    Arrays.stream(array)
          .boxed() //converts IntStream to Stream<Int>
          .collect(Collectors.groupingBy(i -> i, Collectors.counting()));

结果是这张地图:

System.out.println(result);
  

{0 = 2,545 = 1,-4 = 1,-22 = 1,-87 = 1,-999 = 1,-55 = 1,23 = 1,43 = 2,12 = 2} < / p>

答案 3 :(得分:0)

一种简单的方法是使用地图。无需过多更改代码:

 for (int i = 0; i < array.length; i++) {
        int count = 0;
        for (int j = i + 1; j < array.length; j++) {
            if(array[i] == array[j]) {                    
                System.out.println(array[j]);
                count++;
            }
        }
        map.put(array[i], count);
  }

文档: https://docs.oracle.com/javase/7/docs/api/java/util/Map.html

编辑:作为推荐,在完成示例后,您应该对代码进行分析,找到不需要的内容,可以做的更好的事情,等等。

所有辅助阵列都是必需的吗?所有循环都是必需的吗?

答案 4 :(得分:0)

您可以通过为重复值创建一个数组列表来做到这一点:-

Arrays.sort(array);
System.out.println("Array duplicates: ");

ArrayList<Integer> duplicates = new ArrayList<Integer>(); 

for (int i = 0; i < array.length; i++) {
    for (int j = 0; j < array.length; j++) {
        if(j != i && array[i] == array[j] && !duplicates.contains(array[i])){
            duplicates.add(array[i]);
            System.Out.println(duplicates[duplicates.size()-1]);
        }
    }
}

答案 5 :(得分:0)

公共静态无效的findDuplicate(String s){

char[] charArray=s.toCharArray();
ArrayList<Character> duplicateList = new ArrayList<>();
System.out.println(Arrays.toString(charArray));

for(int i=0 ; i<=charArray.length-1; i++){
    if(duplicateList.contains(charArray[i]))
        continue;
    for(int j=0 ; j<=charArray.length-1; j++){
        if(i==j)
            continue;

        if(charArray[i] == charArray[j]){
            duplicateList.add(charArray[j]);
            System.out.println("Dupliate at "+i+" and "+j);
        }
    }
}

}