32

.txt 形式のデータが 100 万行あります。フォーマットは非常にシンプルです。行ごとに:

ユーザー1、値1
ユーザー2、値2
ユーザー3、値3
ユーザー1、値4
...

私の言っていることが分かるよね。ユーザーごとに、何度も表示されることもあれば、1 回だけ表示されることもあります (わかりません)。各ユーザーのすべての値を見つける必要があります。ユーザーはランダムに出現する可能性があるため、Hashmap を使用してそれを行いました。つまり、HashMap(キー: 文字列、値: ArrayList) です。しかし、arrayList にデータを追加するには、常に HashMap get(key) を使用して arrayList を取得し、それに値を追加してから、HashMap に戻す必要があります。あまり効率的ではないように感じます。誰かがそれを行うためのより良い方法を知っていますか?

4

9 に答える 9

13

Google Collections の Multimap を使用します。同じキーに複数の値を許可します

https://google.github.io/guava/releases/19.0/api/docs/com/google/common/collect/Multimap.html

于 2009-06-18T05:21:50.970 に答える
4

HashMap の ArrayList 値は参照です。「HashMap に戻す」必要はありません。HashMap の値として既に存在するオブジェクトを操作しています。

于 2009-06-18T05:21:58.177 に答える
4

ライブラリをインポートしたくない場合。

package util;    

import java.util.ArrayList;    
import java.util.HashMap;    
import java.util.List;    

/**    
 * A simple implementation of a MultiMap. This implementation allows duplicate elements in the the    
 * values. (I know classes like this are out there but the ones available to me didn't work).    
 */    
public class MultiMap<K, V> extends HashMap<K, List<V>> {    

  /**    
   * Looks for a list that is mapped to the given key. If there is not one then a new one is created    
   * mapped and has the value added to it.    
   *     
   * @param key    
   * @param value    
   * @return true if the list has already been created, false if a new list is created.    
   */    
  public boolean putOne(K key, V value) {    
    if (this.containsKey(key)) {    
      this.get(key).add(value);    
      return true;    
    } else {    
      List<V> values = new ArrayList<>();    
      values.add(value);    
      this.put(key, values);    
      return false;    
    }    
  }    
}    
于 2016-03-11T15:47:15.363 に答える
1

あなたが欲しいのはMultimapだと思います。Apache の commons コレクション、または google-collections から取得できます。

http://commons.apache.org/collections/

http://code.google.com/p/google-collections/

「マップに似たコレクションですが、複数の値を単一のキーに関連付けることができます。同じキーで異なる値を使用して put(K, V) を 2 回呼び出すと、マルチマップにはキーから両方の値へのマッピングが含まれます。」

于 2009-06-18T05:24:46.317 に答える
-1

ArrayList は容量に近づくとサイズを変更する必要があるため、ArrayList の代わりに LinkedList を使用すると高速になります。

また、再ハッシュの繰り返しを避けるために、作成しているラッピング コレクション (HashMap または Multimap) の容量を適切に見積もる必要があります。

于 2009-06-18T05:21:29.533 に答える