2011-09-29 3 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));を使用すると、非常に効率的ないないようです。

それは私の質問に私をもたらします。 ArrayListInteger値の更新を最適化するにはどうすればよいですか?

+0

「非常に効率的に見えません」というのは、プロファイルしたようには見えません。 –

+3

マップを使用する必要があります。しかし、2つのリストがあっても、自分自身を反復するのではなく、indexOfを使うことでコードをもっと簡単にすることができます。空リストのケースと「リストにない値」のケースも一緒にグループ化できます。 –

+0

いわゆるマルチセットを再実装しています。その実装を見つけて、それを使用してみてください。 – jmg

答えて

13

は、その後、あなたのaddObservation方法はtskzzyが示唆したように、私はHashMapのやHashtableのを使用することになり

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、非常によく理解しやすい。さらに、データセットを順番に表示する場合は、 TreeMapを使用してください。 – Naved

0

のようになりますので

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

などのHashMapを作成しますHashMap<String,Integer>

を使用してください。あなたのニーズに応じて、名前、カウント、必要なその他のメタデータを持つオブジェクトも作成します。

ので、コードのようなもののようになります。今

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(); 
    } 
} 

incrementCound()メソッドは、カウントをインクリメントし、他の統計を行うだろうが、あなたのFrequencyStatisticsオブジェクトのコンストラクタは、1にそのinital数を自動的に設定します計算が必要な場合があります。これは、対応するIntegerだけを持つStringのハッシュを格納するよりも、将来的には拡張可能でなければなりません。

+1

頻度カウントを保持する目的だけのオブジェクトを作成するのは少しコストがかかると私は思います。 – Naved

+0

合意されていますが、これは他の要件に依存し、他の統計情報も生成する必要がある場合です。 –

関連する問題