2011-03-19 28 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."); 
         } 
        } 
    }