2017-03-16 207 views
1

我需要編寫一個方法,其中int[]將作爲輸入提供,它應該返回一個數組,但所有數字發生的次數超過n次。刪除陣列中的重複元素以及Java 1.7中的元素

Inputs: 
    (int list) data = [1, 2, 2, 3, 3, 3, 4, 5, 5] 

Output: 
    (int list) [1, 4] 

這些是我嘗試過的步驟。

  1. 將int數組複製到ArrayList(inputList)。
  2. 創建LinkedHashset以查找唯一值
  3. 迭代LH並使用迭代器查找ArrayList的收集頻率。

    int[] intArray = new int[0]; 
    
    if(n!=0){ 
        if(data.length<100){ 
    
         ArrayList<Integer> inputList = new ArrayList<Integer>(data.length); 
         //System.out.println(Arrays.toString(data)); 
         for (int i = 0; i < data.length; i++){ 
          inputList.add(Integer.valueOf(data[i])); 
         } 
    
         LinkedHashSet<Integer> lhs = new LinkedHashSet<>(inputList); 
    
         intArray = new int[lhs.size()]; 
         int i=0; 
         int j=0; 
         Iterator<Integer> itr = lhs.iterator(); 
         while(itr.hasNext()){ 
          Integer shiftNumber = itr.next(); 
    
          if(Collections.frequency(inputList, shiftNumber)==1) { 
           intArray[i++] = shiftNumber.intValue(); 
           j++; 
          } 
    
    
         } 
         intArray = Arrays.copyOf(intArray, j); 
         return intArray; 
        } 
    } 
    
    return intArray; 
    

我能夠與上述snippet.However達到的結果是,我需要在減少的代碼段,並通過使用任何算法或其他集合對象提高性能的建議。

+3

看起來要張貼到[代碼審查(http://codereview.stackexchange.com /),SO不是爲了改進工作代碼,而是修復破壞的代碼。 –

+0

或者您可以查找答案進行比較並查看其他要測試的解決方案。 [刪除重複](http://stackoverflow.com/questions/10056729/java-remove-duplicates-from-an-array) – Underbalanced

+0

@Underbalanced請重新閱讀聲明。問題是刪除包含重複項目的項目。 輸入: (INT表)數據= [1,2,2,3,3,3,4,5,5] 輸出:用於問題 (INT表)[1,4] – Satheesh

回答

2

你很可能過於複雜的算法的計數器值。將每個值映射到其頻率可能會更簡單,然後複製這些值的頻率小於n。另外請注意,您不需要明確地在intInteger之間進行轉換:Java會自動爲您做。

int[] output = new int[input.length]; 
Map<Integer,Integer> counts = new HashMap<>(); 
int size = 0; 
for (int i = 0; i < input.length; i++) { 
    counts.put(input[i], counts.getOrDefault(input[i], 0) + 1); 
} 
for (int i = 0; i < input.length; i++) { 
    if (counts.get(input[i]) < n) 
     output[size++] = input[i]; 
} 
return Arrays.copyOf(output, size); 

如果你熟悉Java然後8流的代碼可以大大減少:

Map<Integer,Integer> count = Arrays.stream(input).boxed() 
    .collect(groupingBy(identity(), counting())); 
return Arrays.stream(input).filter(i -> count.get(i) < n).toArray(); 
+0

,你可以使用更多consise方法來計算地圖值。 counts(int i = 0; i v == null?1:v ++); } – Underbalanced

3

您可以改用地圖。

映射鍵將表示數組中找到的值;該地圖值將是一個計數器。你迭代你的數組,併爲每個元素放置一個計數器= 1(當第一次找到該值時);或者你只需​​增加該櫃檯。

最後,你只能收集那些地圖鍵,顯示的1