2011-09-29 4 views
4

특정 변수의 모든 값을 데이터 집합에 저장하고 각 값의 빈도를 저장하려고합니다. 이렇게하려면 ArrayList<String>을 사용하여 값을 저장하고 ArrayList<Integer>을 사용하여 주파수를 저장합니다 (int을 사용할 수 없기 때문에). 다른 값의 수를 알 수 없으므로 ArrayList이 아닌 Array을 사용합니다.ArrayList의 값 업데이트를 최적화하는 방법 <Integer>

예 (간략화 된) 데이터 세트 :

a,b,c,d,b,d,a,c,b 

값으로 ArrayList<String>는 같다 : {a,b,c,d} 및 주파수와는 ArrayList<Integer> 같다 : {2,3,2,2}.

이들을 채우려면 다음 코드를 사용하여 데이터 집합의 각 레코드를 반복합니다.

public void addObservation(String obs){ 
    if(values.size() == 0){// first value 
     values.add(obs); 
     frequencies.add(new Integer(1)); 
     return;//added 
    }else{ 
     for(int i = 0; i<values.size();i++){ 
      if(values.get(i).equals(obs)){ 
       frequencies.set(i, new Integer((int)frequencies.get(i)+1)); 
       return;//added 
      } 
     } 
     // only gets here if value of obs is not found 
     values.add(obs); 
     frequencies.add(new Integer(1)); 
    } 
} 

는 그러나, 나는 매우 큰 수 있습니다 이것을 사용하는 데이터 세트부터, 내 코드를 최적화 할, 그리고 frequencies.set(i, new Integer((int)frequencies.get(i)+1));를 사용하여 매우 효율적인 보이지 않는다.

그건 내 질문에 나를 데려옵니다; ArrayList에서 Integer 값의 업데이트를 최적화하려면 어떻게해야합니까?

+0

"매우 효율적으로 보이지는 않습니다."프로파일을 작성한 것처럼 보이지 않습니다. –

+3

지도를 사용해야합니다. 그러나 두 개의 목록을 사용하더라도 자신을 반복하는 대신 indexOf를 사용하면 코드를 훨씬 간단하게 만들 수 있습니다. 빈 목록의 경우와 "목록에없는 값"의 경우도 함께 그룹화 할 수 있습니다. –

+0

소위 멀티 세트를 다시 구현 중입니다. 이를위한 구현을 찾아서 사용하십시오. – jmg

답변

13

사용은 HashMap<String,Integer>

는 그런 다음 addObservation 방법 tskzzy 제안으로 내가는 HashMap 또는 해시 테이블을 사용

public void addObservation(String obs) { 
    if(hm.contains(obs)) 
     hm.put(obs, hm.get(obs)+1); 
    else 
     hm.put(obs, 1); 
} 
+0

고마워요! 나는이 목적에 더 적합한 클래스가 있을지도 모르겠다는 ArrayList를 사용하는 것에 집중했다. – Maza89

+1

+1, 매우 이해하기 쉽고 이해하기 쉽습니다. 또한 데이터 세트를 순서대로 표시하려는 경우; 트리 맵을 사용하십시오. – Naved

0

모양을 너무

HashMap<String,Integer> hm = new HashMap<String,Integer>(); 

처럼의 HashMap를 작성합니다. 필요에 따라 이름, 개수 및 필요한 기타 메타 데이터가있는 개체를 만들 수도 있습니다.

그래서 코드가 같은 것 : 지금

Hashtable<String, FrequencyStatistics> statHash = new Hashtable<String, FrequencyStatistics>(); 
for (String value : values) { 
    if (statHash.get(value) == null) { 
     FrequencyStatistics newStat = new FrequencyStatistics(value); 
     statHash.set(value, newStat); 
    } else { 
     statHash.get(value).incrementCount(); 
    } 
} 

를, 당신의 FrequencyStatistics는 incrementCound() 메소드는 수를 증가 및 기타 통계를 수행 할 때 생성자가 자동으로 1의 inital 수를 설정합니다 객체 계산이 필요할 수도 있습니다. 이것은, 대응하는 Integer만을 가지는 String의 해시를 격납하는 것보다 장래에보다 확장 할 필요가 있습니다.

+1

빈도를 유지하기위한 개체를 만드는 것은 약간 비용이 많이 든다는 생각이 듭니다. – Naved

+0

동의하지만 다른 요구 사항에 따라 다르며 다른 통계 정보를 생성해야하는 경우에도 필요합니다. –

관련 문제