18

以下のようなデータがあります。

 Key       value
-----      ------
car         toyota
car         bmw
car         honda

fruit       apple
fruit       banana

computer    acer
computer    asus
computer    ibm 
...

(上記のデータの各行は、フィールド「キー」と「値」を持つオブジェクトList<DataObject>であり、すべて 1 つの List にあります)

次のようなデータを作成したいとMap<String, List<String>>思います。

 "car"      : ["toyota", "bmw", "honda"]
 "fruit"    : ["apple","banana"]
 "computer" : ["acer","asus","ibm"]

Mapデータオブジェクトから上記の構造を達成する方法は?

** * ***他に* ** * **

外部ライブラリを使用する代わりに、純粋なJDK提供のクラスまたはインターフェースを使用して結果を達成することにもっと興味があります。何か助けはありますか?

4

6 に答える 6

30
    Map<String, List<String>> myMaps = new HashMap<String, List<String>>();
    for (DataObject item : myList) {
        if (!myMaps.containsKey(item.getKey())) {
            myMaps.put(item.getKey(), new ArrayList<String>());
        }
        myMaps.get(item.getKey()).add(item.getValue());
    }
于 2012-06-07T08:41:31.820 に答える
11

私はグアバのMultimap実装を使用します。しかし、標準のJDKでも簡単に実行できます。

標準JDKの例:

public static void main(String[] args) {
    Scanner s = new Scanner(
            "car         toyota\n" +
            "car         bmw\n" +
            "car         honda\n" +
            "fruit       apple\n" +
            "fruit       banana\n" +
            "computer    acer\n" +
            "computer    asus\n" +
            "computer    ibm");

    Map<String, List<String>> map = new LinkedHashMap<String, List<String>>();

    while (s.hasNext()) {

        String key = s.next();
        if (!map.containsKey(key))
            map.put(key, new LinkedList<String>());

        map.get(key).add(s.next());
    }

    System.out.println(map);
}

グアバの例:

public static void main(String[] args) {
    Scanner s = new Scanner(
            "car         toyota\n" +
            "car         bmw\n" +
            "car         honda\n" +
            "fruit       apple\n" +
            "fruit       banana\n" +
            "computer    acer\n" +
            "computer    asus\n" +
            "computer    ibm");

    Multimap<String, String> map = LinkedListMultimap.create();

    while (s.hasNext()) 
        map.put(s.next(), s.next());

    System.out.println(map);
}

出力 (両方の実装):

{car=[toyota, bmw, honda], fruit=[apple, banana], computer=[acer, asus, ibm]}
于 2012-06-07T08:12:03.353 に答える
6
Map<String, List<String>> data = new HashMap<String, List<String>>();
data.put("car", Arrays.asList("toyota", "bmw", "honda"));
data.put("fruit", Arrays.asList("apple","banana"));
data.put("computer", Arrays.asList("acer","asus","ibm"));
于 2012-06-07T08:12:26.907 に答える
5

以下のスニペットが役に立ちます。

HashMap<String, ArrayList<String>> map = new HashMap<String, ArrayList<String>>();

ArrayList<String> carList = new ArrayList<String>();
carList.add("toyota");
carList.add("bmw");
carList.add("honda");

map.put("car", carList);

ArrayList<String> fruitList = new ArrayList<String>();
fruitList .add("apple");
fruitList .add("banana");

map.put("fruit", fruitList );
于 2012-06-07T08:14:47.690 に答える
3

オブジェクトを反復処理します。各オブジェクトについて、対応するリストをマップから取得します。null の場合、新しいリストを作成してマップに配置します。次に、値をリストに追加します。

または、これを行うGuava の ListMultimapを使用します。

于 2012-06-07T08:11:56.317 に答える
1

もしかしてこういうこと?

Map<String, List<String>> dataMap = new HashMap<String, List<String>>();

擬似コード:

for (String key : keys) {
    if (!dataMap.containsKey(key)) {
        dataMap.put(key, new ArrayList<String>());
    }

    dataMap.get(key).add(getValue(key));
}

または、 Guava を使用しますListMultiMap

于 2012-06-07T08:12:44.087 に答える