1

私はnGramsに取り組んでおり、ネストされたTreeMapのようなデータ構造を使用してngramを保存しています。Quadgrams のテンプレートは次のようになります。

public TreeMap<String, TreeMap<String, TreeMap<String, TreeMap<String, Integer>>>> ngramWordCounter;

問題は、ファイルにダンプしようとしているときに発生しています。基本的に、最初のマップのキーセットを反復処理し、次に 2 番目のキーマップなどを反復処理しています。その結果、多くの一時オブジェクトが作成され、GCOverlimitExceeded エラーが発生します。繰り返しのコード スニペットは次のとおりです。

for(String key: ((Quadgram)quadgram).ngramWordCounter.keySet())
{
  for(String key1: ((Quadgram)quadgram).ngramWordCounter.get(key).keySet())
  {
    for(String key2: ((Quadgram)quadgram).ngramWordCounter.get(key).get(key1).keySet())
    {
        for(String key3:((Quadgram)quadgram).ngramWordCounter.get(key).get(key1).get(key2).keySet())
        {
            //Do something
        }
    }
  } 
}

一時オブジェクトを作成せずにこのリストを反復処理するより良い方法はありますか?

4

1 に答える 1

1

新しいオブジェクトは作成されません。新しい参照が作成されます。

Map は、キーセット内のキーへの参照を返します。このリファレンスを使用してこの概念を調べたり、この概念に関する Java チュートリアルを読んだりできます。

マップを反復する次の方法を好む

for (Map.Entry<String, String> entry : map.entrySet()) {
        String key = entry.getKey();
            String value = entry.getValue();
            // process key and value
}
于 2014-03-05T05:43:49.533 に答える