2011-03-19 74 views
4

我想检测Java数组中的重复值。例如:检测原始Java数组中的重复值

int[] array = { 3, 3, 3, 1, 5, 8, 11, 4, 5 }; 

我怎样才能得到特定的重复条目以及它发生了多少次?

+0

哪些值是你找谁? 3s还是5s? – 2011-03-19 18:58:46

+0

我试图找到3s和5s以及它们发生的时间。 – 2011-03-19 19:02:12

回答

6

我将有一个Map<Integer, Integer>其中第一个整数是数组中出现的数字的value,第二个整数是count(出现次数)。在一个循环中

  • 为阵列中的每个项目通过array.length

    • 运行,做一个map.containsKey(array[i])。如果地图中存在数字,则增加该数字(类似于map.put(array[i], map.get(array[i]) + 1)。否则,在地图中创建一个新条目(例如,map.put(array[i], 1)
    • )最后,迭代地图并检索值大于1的所有键。
  • +0

    正确的'map.put(map.get [array [i] + 1)'? – 2011-11-25 20:48:56

    +0

    @yannis hristofakis,nope。这是一个错字。修正了我发布的错误。 – 2013-03-23 12:10:24

    0

    分配的第一步一个计数器,那么你可以将它们涉及到的另一个数组分配每个号码然后索引如果您的号码被复制增量您的柜台......

    3
    public class Duplicate { 
    
        public static void main(String[] arg) { 
         int[] array = {1, 3, 5, 6, 2, 3, 6, 4, 3, 2, 1, 6, 3}; 
    
         displayDuplicate(array); 
    
        } 
    
        static void displayDuplicate(int[] ar) { 
         boolean[] done = new boolean[ar.length]; 
         for(int i = 0; i < ar.length; i++) { 
          if(done[i]) 
           continue; 
          int nb = 0; 
          for(int j = i; j < ar.length; j++) { 
           if(done[j]) 
            continue; 
           if(ar[j] == ar[i]) { 
            done[j] = true; 
            nb++; 
           } 
          } 
          System.out.println(ar[i] + " occurs " + nb + " times"); 
         } 
        } 
    } 
    
    +2

    请不要用代码回答明显的作业问题。提示或什么 - 除了为他做功课。是的,看问题的性质,以确定这是一个家庭作业问题,他们并不总是标记它。 – 2011-03-19 19:07:40

    +0

    对不起... – evilone 2011-03-19 19:12:24

    +0

    我只是指出,因为人们通常渴望帮忙,有时不真正考虑问题的本质。 – 2011-03-19 19:31:10

    4

    问题的答案取决于你的源阵列的数量范围内。如果范围足够小,您可以将源个数指标在分配数组,环通源和增量:

    int[] counts = new int[max_value + 1]; 
    
    for (int n: array) { 
        counts[n]++; 
    } 
    

    如果您的源数组包含未知或太大范围,则为您可以创建一个Map并计入:

    Map<Integer,Integer> counts = new HashMap<Integer,Integer>(); 
    
    for (Integer n: array) { 
        if (counts.containsKey(n)) { 
         counts.put(n, counts.get(n) + 1); 
        } else { 
         counts.put(n, 1); 
        } 
    } 
    

    注意:在没有JVM帮助的情况下输入上述内容,摆脱印刷错误 作为读者的练习:-)

    0

    对数组进行排序,然后对其进行扫描或按任一方向扫描Arrays.binarySearch +。由于分配少得多,没有包装,这可能会更快,尤其是在较大的阵列上。

    5

    看起来像数据结构的工作,称为multiset

    Multiset<Integer> mp = HashMultiset.create(); 
    mp.addAll(Arrays.asList(new Integer[] { 3, 3, 3, 1, 5, 8, 11, 4, 5 })); 
    

    标准JDK 6是原始的,不包含multiset。如果您不想重写它,可以使用预先存在的库,如Google Guava库或Apache Commons。

    例如与番石榴库,你可以

    for (Integer i : mp.elementSet()) 
         System.out.println(i + " is contained " + mp.count(i) + " times."); 
    

    ,这将输出:

    1 is contained 1 times. 
    3 is contained 3 times. 
    4 is contained 1 times. 
    5 is contained 2 times. 
    8 is contained 1 times. 
    11 is contained 1 times. 
    
    3
    import java.util.HashMap; 
    import java.util.Iterator; 
    import java.util.Map; 
    
    public class DuplicatedValuesInArray 
    { 
    
        public static void main(String args[]) { 
         int[] array = { 3, 3, 3, 1, 5, 8, 11, 4, 5 }; 
         Map<Integer, Integer> map= new HashMap<Integer, Integer>(); 
    
         for(int i=0;i<array.length;i++) { 
          if(map.containsKey(array[i])) 
    
          map.put(array[i],map.get(array[i]) + 1); 
         else 
          map.put(array[i], 1); 
         } 
    
         for (Integer i : map.keySet()) { 
          System.out.println(i + " is contained " + map.get(i) + " times."); 
         } 
        } 
    }