如何优化ArrayList <Integer>中值的更新

Maz*_*a89 4 java

我想在数据集中存储某个变量的所有值以及每个值的频率.为此,我使用a ArrayList<String>来存储值和a ArrayList<Integer>来存储频率(因为我不能使用int).不同值的数量是未知的,这就是我使用ArrayList和不使用的原因Array.

示例(简化)数据集:

a,b,c,d,b,d,a,c,b
Run Code Online (Sandbox Code Playgroud)

ArrayList<String>与价值观是这样的:{a,b,c,d}ArrayList<Integer>同频率的样子:{2,3,2,2}.

为了填充这些,ArrayLists我使用以下代码迭代数据集中的每个记录.

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));
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,由于我将使用它的数据集可能非常大,我想优化我的代码,并且使用frequencies.set(i, new Integer((int)frequencies.get(i)+1));似乎不是非常有效.

这让我想到了我的问题; 如何优化更新IntegerArrayList

tsk*_*zzy 13

用一个 HashMap<String,Integer>

像这样创建HashMap

HashMap<String,Integer> hm = new HashMap<String,Integer>();
Run Code Online (Sandbox Code Playgroud)

然后你的addObservation方法看起来像

public void addObservation(String obs) {
    if( hm.contains(obs) )
        hm.put( obs, hm.get(obs)+1 );
    else
        hm.put( obs, 1 );
}
Run Code Online (Sandbox Code Playgroud)