データセット内の特定の変数のすべての値と、これらの各値の頻度を保存します。これを行うには、値を格納するために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
値の更新を最適化するにはどうすればよいですか?
「非常に効率的に見えません」というのは、プロファイルしたようには見えません。 –
マップを使用する必要があります。しかし、2つのリストがあっても、自分自身を反復するのではなく、indexOfを使うことでコードをもっと簡単にすることができます。空リストのケースと「リストにない値」のケースも一緒にグループ化できます。 –
いわゆるマルチセットを再実装しています。その実装を見つけて、それを使用してみてください。 – jmg