2012-08-31 61 views
2

我有一個int數組:找到元件的頻率在Java陣列

{1,2,4,2,3,5,6,4,3} 

如何找到陣列元件等1=1,2=2,3=2,4=4..的頻率。我需要一個類,我可以傳遞我的數組並返回一個給出數組元素數的數組。例如: - array{[0]=1,[1]=2,[2]=3,[3]=4..}(對於上面的示例數組);

+17

聞起來像做作業一樣有 –

+4

你[試圖]什麼(http://mattgemmell.com/2008/12/08/what-have-you-tried/)? – higuaro

+2

'Collections.frequency(Arrays.asList(...),X)' – oldrinb

回答

4

你要做的幾件事情:

  1. 定義的上限和下限爲你的號碼的範圍。
  2. 建立一個方便的對象/數據結構來存儲這些數字的出現。
  3. 迭代傳入的數組並計算每個數字的所有出現次數,將結果存儲在方便的對象/數據結構中。

如果這是以一種簡單的方式完成的,它可能只是從傳入的數組中讀取元素並打印出最終結果。

2

沒有給它遠離這裏是一個很好的起點:

int[] array = {1,2,4,2,3,5,6,4,3}; 

     public int[] (array){ 
      //need to perform a sort...or a search 
      //after searching check for matches, 
      //sorting could make performing comparisons more efficient 
      //not all searches/sorts are created equal. 

      int[array.length] result += {"["+numberChecked+"]="+freqOccurred}; 
      return result; 
     } 

此代碼還沒有被編譯,以便把它更像僞代碼。目的是讓你思考如何達到預期的目標。一個Java包可能已經存在,可以檢查數組中的頻率元素,但這是您最可能尋找的。祝你好運。

1

我有計數元件的頻率在Java陣列

import java.io.BufferedReader; 

import java.io.InputStreamReader; 

public class ItemCount { 

public static void main(String[] args) 
{ 
    try{ 
      int count=1,index=1; 
      BufferedReader br=new BufferedReader(new InputStreamReader(System.in)); 
      System.out.print("Enter the Size of array : "); 
      int size=Integer.parseInt(br.readLine()); 
      System.out.print("Enter the Elements of array : "); 
      int arr[]=new int[size]; 

      for(int i=0;i<arr.length;i++) 
      { 
       System.out.print("arr["+i+"] : "); 
       arr[i]=Integer.parseInt(br.readLine()); 
      } 
      System.out.print("Sorted Array is :"); 
      SortingArray.sortDescendind(arr); 

      for(int i=0;i<arr.length;i++) 
      { 
       System.out.println("arr["+i+"] : "+arr[i]); 

      } 

      for(int i=0;i<arr.length;) 
      { 
       count=1; 
       for(index=i+1;index<arr.length;index++) 
       { 
        if(arr[i]==arr[index]) 
        { 
         count++; 
        } 
        else{ 

         break; 
        } 


       } 
       System.out.println(""+arr[i] +"----> "+count); 
       i+=count; 

      } 

    }catch(Exception ex) 
    { 
     ex.printStackTrace(); 
    } 
} 

} 

溶液///你可以選擇陣列中的任何分選方法----> SortingArray.sortDescendind(ARR)

+0

解決方案的時間複雜度是O(n^2),這不是最優的。 – Hengameh

+0

@hengameh,只是一個猜測,但不會最好的時間複雜度是O(n),因爲你必須至少讀一次數組? @JavaFun,** tl; dr **但最快的方式來做(我認爲)將是一個二維計數數組並讀取一次原始數組。在讀取數組時,每次遇到數組中的新元素時,向計數數組中添加'{element,occurrences}',並且如果遇到舊元素,只需將其添加到其出現位置 – Lightfire228

2

在Java 8可以做到這一點

Map<Integer, Long> freq = Arrays.stream(array).boxed(). 
       collect(Collectors.groupingBy(Integer::intValue, Collectors.counting())); 
+0

Isn' t足夠使用'Function.identity()'而不是'Integer :: intValue'?在這種情況下,我們並不需要取消整數整數 –

+0

@Anton是的,它應該工作,而我不知道它節省了多少。 –

2

如果指定的數組元素的範圍和限制在陣列大小,最好的辦法是使用哈希映射。 T(n)= O(n),輔助空間= O(n)。

public static void findCount3(int[] a){ 
    Map<Integer, Integer> hm = new HashMap<Integer, Integer>();  
    for(int i = 0; i < a.length; i++){ 
      if(!hm.containsKey(a[i])){ 
       hm.put(a[i], 1); 
      }else{ 
       hm.put(a[i], hm.get(a[i])+1); 
    }    
    System.out.println(hm);   
} 
+0

爲什麼首先需要循環? – ankit

3
class MapTest 
{ 
    public static void main(String args[]){ 
     HashMap<Integer,Integer> h = new HashMap<Integer,Integer>(); 
     int arr[] = new int[]{2,2,3,3,5,6,7,9,9,0}; 
     for(int i=0; i<arr.length; i++){ 
      if(h.containsKey(arr[i])){ 
       h.put(arr[i], h.get(arr[i]) + 1); 
      } else { 
       h.put(arr[i], 1); 
      } 
     } 
     System.out.println(h); 
    } 
} 
2
import java.util.*; 
class Findfreqarray 
{ 
    public static void main(String args[]) 
    { 
     int t, i, j, len, count=0; 
     Scanner in = new Scanner(System.in); 
     System.out.println("Enter number of elements to insert in an array: "); 
     len = in.nextInt(); 
     int[] arr = new int[len]; 
     System.out.println("Enter elements to insert in an array: "); 
     for(i=0;i<len;i++) 
     { 
      t = in.nextInt(); 
      arr[i] = t; 
     } 
     System.out.println("\n"); 
     for(i=0;i<len;i++) 
     { 
      count=1; 
      for(j=i+1;j<=len-1;j++) 
      { 
       if(arr[i]==arr[j] && arr[i]!='\0') 
       { 
        count++; 
        arr[j] = '\0'; 
       } 
      } 
      if(arr[i]!='\0') 
      { 
       System.out.println(arr[i] + " is " + count + " times.\n"); 
      } 
     }   
    } 
}