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

查找数组中出现的重复数-Java,java,arrays,Java,Arrays,我不能对这件事耿耿于怀。需要找到重复的,我找到了。现在剩下的就是打印一个副本在数组中出现的次数。我刚开始学习Java,所以需要硬编码才能理解。花上最后两天的时间想办法解决,但运气不好。。任何帮助都会很好!谈话很便宜,下面是代码 import java.util.Arrays; public class LoopTest { public static void main(String[] args) { int[] array = {12,23,-22,0,43,54

我不能对这件事耿耿于怀。需要找到重复的,我找到了。现在剩下的就是打印一个副本在数组中出现的次数。我刚开始学习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]);
                }

            }
        }
    }
}
导入java.util.array;
公共类循环测试{
公共静态void main(字符串[]args){
int[]数组={12,23,-22,0,43545,-4,-55,43,12,0,-999,-87};
int正计数器=0;
int负_计数器=0;
for(int i=0;i0){
正_计数器++;
}else if(数组[i]<0){
负_计数器++;
}
}
int[]正数数组=新的int[正数计数器];
int[]负数组=新int[负计数器];
正计数器=0;
负计数器=0;
for(int i=0;i0){
正数组[正计数器++]=数组[i];
}else if(数组[i]<0){
负数组[负计数器++]=数组[i];
}
}
System.out.println(“正数组:”+(Arrays.toString(正数组));
System.out.println(“负数组:”+(Arrays.toString(负数组));
数组。排序(数组);
System.out.println(“数组副本:”);
for(int i=0;i
由于您已经在对阵列进行排序,因此只需一个循环即可找到重复的阵列(它们将彼此相邻,对吗?)。因此,您可以执行以下操作:

            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
                    }
            }

你也可以使用一些Java的铃铛和口哨,比如把值插入地图或者类似的东西,但我想你是从算法的角度来看的,所以上面是一个简单的答案,只有一个循环,那么你永远不会使用它们,那么这种分离的目的是什么? 我只是给你一个与你的问题相关的想法,最好是自己解决它,这样你就可以接触到Java

解决方案:可以使用字典键值对。遍历数组,将元素作为键放在字典中,将值作为零,在每次迭代中检查该键是否已经存在于字典中,只需增加其值。最后,所有值都是数组中出现的重复值


希望对你有帮助

一个简单的方法是使用地图。在不过度更改代码的情况下:

 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);
  }
for(int i=0;i
文件:

编辑:作为一项建议,在您完成示例之后,您应该分析您的代码,找出哪些不必要,哪些可以做得更好,等等


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

从算法的角度来看,Veselin Davidov的答案是好的(效率最高)

在生产代码中,您更愿意这样编写:

Map<Integer, Long> result = 
    Arrays.stream(array)
          .boxed() //converts IntStream to Stream<Int>
          .collect(Collectors.groupingBy(i -> i, Collectors.counting()));
{0=2545=1,-4=1,-22=1,-87=1,-999=1,-55=1,23=1,43=2,12=2}


您可以通过为重复值创建数组列表来执行此操作:-

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]);
        }
    }
}
array.sort(数组);
System.out.println(“数组副本:”);
ArrayList duplicates=新的ArrayList();
for(int i=0;i
公共静态无效查找副本(字符串s){

char[]charArray=s.toCharArray();
ArrayList duplicateList=新的ArrayList();
System.out.println(Arrays.toString(charArray));

对于(int i=0;i)创建一个映射,其中key是一个数字,value是出现的次数。您不在任何地方定义map变量((:如果数组没有排序的话就不会那么容易了。但是+1是的!这非常好,事情看起来更清楚了。谢谢!回答得好,但是流可能是一个过火的想法,因为OP只是刚刚开始学习java。@TA我同意。这个答案更适合未来的谷歌用户,因为计算一些发生的事件ces是一个常见的需求。这是我的教授给我的许多测试之一,我想练习和理解数组和循环。我想自己完成它,但没有运气。谢谢你的输入!欢迎使用SO!当你用代码回答问题时,请解释一下你的问题。在这种情况下,有更多的答案,因此可以展示你的优点s
System.out.println(result);
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]);
        }
    }
}
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);
        }
    }
}