2017-09-26 100 views
0

我想寫一個代碼,它將在數組中找到重複的值。所以,到目前爲止,我已經寫了下面的代碼:在java中查找數組中的重複值

public static void main(String[] args) { 
     // TODO Auto-generated method stub 
     Scanner sc = new Scanner(System.in); 
     //System.out.println("Please enter the length of Array: "); 
     int[] array = new int[6]; 
     for(int i =0; i<array.length;i++) { 
      System.out.println("Enter value for index "+i+":"); 
      array[i] = sc.nextInt(); 
      } 

     FindDuplicateInArray obj = new FindDuplicateInArray(); 

     obj.findDupicateInArray(array); 
    } 

    public void findDupicateInArray(int[] a) { 
     //int pointer = a[0]; 
     int count=0; 
     for(int j=0;j<a.length;j++) { 
      for(int k =j+1;k<a.length;k++) { 
       if(a[j]==a[k] && j!=k && j<k && count<=1) { 
        count++; 
        if(count==1) 
        System.out.println(a[j]); 

       } 

      } 


     } 

    } 

但我沒有得到預期的輸出,例如:

  1. 如果我給值爲1,2,1,4,3,1那麼它正在成功找到重複值1.

  2. 但是,如果我在數組中提供了2組重複值,仍然是找到第一個重複。 例如1,2,1,2,1,3。它給輸出僅1.

我發現不正確的結果的原因是計數即計數被設置爲大於1的條件並且不匹配於第一if條件。

所以,我試圖在一次循環迭代後將計數器重置爲0,現在它給出所有重複值,但重複值打印兩次。

public static void main(String[] args) { 
     // TODO Auto-generated method stub 
     Scanner sc = new Scanner(System.in); 
     //System.out.println("Please enter the length of Array: "); 
     int[] array = new int[6]; 
     for(int i =0; i<array.length;i++) { 
      System.out.println("Enter value for index "+i+":"); 
      array[i] = sc.nextInt(); 
      } 

     FindDuplicateInArray obj = new FindDuplicateInArray(); 

     obj.findDupicateInArray(array); 
    } 

    public void findDupicateInArray(int[] a) { 
     //int pointer = a[0]; 
     int count=0; 
     for(int j=0;j<a.length;j++) { 
      for(int k =j+1;k<a.length;k++) { 
       if(a[j]==a[k] && j!=k && j<k && count<=1) { 
        count++; 
        if(count==1) 
        System.out.println(a[j]); 

       } 

      } 
      **count = 0;** 

     } 

    } 

例如,輸入:1,2,1,2,1,2,輸出:1 2 1 2

請建議如何得到正確的結果。

+3

歡迎來到Stack Overflow!它看起來像你需要學習使用調試器。請幫助一些[互補調試技術](https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)。如果您之後仍然遇到問題,請隨時回答一個更具體的問題。 –

回答

0

你是在正確的路上,我剛剛更新你的方法,我希望你會明白什麼是你的錯誤:

public void findDupicateInArray(int[] a) { 
     int count=0; 
     for(int j=0;j<a.length;j++) { 
      for(int k =j+1;k<a.length;k++) { 
       if(a[j]==a[k]) { 
        count++; 
       } 
      } 
      if(count==1) 
       System.out.println(a[j]); 
      count = 0; 
     } 
    } 

然而,這將使你的代碼運行正常,而且不意味着你已經編寫了最佳代碼。

+0

謝謝你,這是給我正確的結果,但如果萬一我會提供輸入: 1,2,1,2,1,3,那麼它會給出2 1 1沒有2輸出。 我知道這個原因,如果對於初始迭代,它會使count大於1,然後從最後一次迭代中打印出j的值。但是可以按1 2而不是2 1的順序打印值? – Shan

+0

@Shan是的,這是可能的;您可以先對數組進行排序,然後使用此函數查找重複數據,或者將重複值收集到新數組中,然後對其進行排序並將其打印出來。 –

0

請看下面的代碼它會幫助你。

我們必須計算每個元素的重複次數,然後在最後找到計數,這會告訴重複的數字。

package com.java; 

import java.util.Arrays; 
import java.util.LinkedHashMap; 
import java.util.LinkedHashSet; 
import java.util.Map; 
import java.util.Set; 

public class FindDuplicateInArray { 

    public static void main(String[] args) { 

     int[] intArr = new int[] { 1, 2, 1, 2, 1, 3, 4, 6, 2, 8 }; 

     Map<Integer, Integer> map = new LinkedHashMap<Integer, Integer>(); 

     for (int i = 0; i < intArr.length; i++) { 
      // take first element and then matched complete array 
      int temp = intArr[i]; 
      int count = 0; 

      for (int j = 0; j < intArr.length; j++) { 
       if (temp == intArr[j]) { 
        // element matched -- break 
        count++; 
       } 
      } 
      map.put(temp, count); 
     } 

     Set<Integer> duplicate = new LinkedHashSet<Integer>(); 
     Set<Integer> noDuplicate = new LinkedHashSet<Integer>(); 

     for (int i = 0; i < intArr.length; i++) { 
      if (map.containsKey(intArr[i])) { 
       System.out.println("Key :" + intArr[i] + " Value : " + map.get(intArr[i])); 

       if (map.get(intArr[i]) > 1) { 
        // means repeated character 
        duplicate.add(intArr[i]); 

       } else { 
        // non repeated character 
        noDuplicate.add(intArr[i]); 
       } 
      } 
     } 

     System.out.println("Duplicate Chars : " + Arrays.toString(duplicate.toArray())); 
     System.out.println("No Duplicate Chars : " + Arrays.toString(noDuplicate.toArray())); 

    } 

} 
0

也許是更容易將數組轉換爲列表和使所有的邏輯與Java 8流API中的一句話:

 Integer[] numbers = new Integer[] { 1, 2, 1, 2, 1, 3 }; 
    List<Integer> listInteger = Arrays.asList(numbers);   
    listInteger.stream().filter(i -> Collections.frequency(listInteger, i) >1).collect(Collectors.toSet()).forEach(System.out::println); 

輸出

1 
2 
0

我不喜歡使用Streams或者高等級來解決algorythmic問題;只有普通的java。所以這是我的解決方案:

public static Set<Integer> findDuplicateInArray(int... arr) { 
    Set<Integer> unique = new HashSet<>(); 
    Set<Integer> duplicate = new HashSet<>(); 

    for (int val : arr) 
     (unique.contains(val) ? duplicate : unique).add(val); 

    return duplicate; 
} 

如果你可以修改進來的arr,然後用一些小的修改,你可以從Set<Integer> unique refuce。