Как получить эту структуру Map‹String, List‹››

У меня есть данные, как показано ниже:

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

fruit       apple
fruit       banana

computer    acer
computer    asus
computer    ibm 
...

(Каждая строка приведенных выше данных представляет собой объект с полями "ключ" и "значение", все в одном списке List<DataObject>)

Я хотел бы построить данные для Map<String, List<String>> следующим образом:

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

Как получить структуру выше Map из объектов данных?

******Кроме того***

Меня больше интересует использование чистых классов или интерфейсов, предоставляемых JDK, для достижения результата вместо использования внешней библиотеки. Любая помощь?


person Mellon    schedule 07.06.2012    source источник
comment
Вы уже объяснили, как это должно выглядеть (Map<String, List<String>>). Что значит, как этого добиться? Кроме того, где и в каком формате хранятся эти данные?   -  person adarshr    schedule 07.06.2012
comment
@adarshr, поскольку список данных имеет случайную длину (таких данных может быть много), мне нужен общий способ построения структуры карты. Я не уверен, как это сделать.   -  person Mellon    schedule 07.06.2012
comment
Где/как хранятся эти данные? CSV? База данных? XML? JSON?   -  person adarshr    schedule 07.06.2012
comment
@ adarshr, как я уже упоминал, я уже получил данные в виде списка List‹DataObject› , каждый DataObject представляет собой строку с полями ключа и значения   -  person Mellon    schedule 07.06.2012
comment
Вы можете использовать ListMultimap из коллекции Google Guava. docs.guava-libraries.googlecode. com/git/javadoc/com/google/   -  person Peter Štibraný    schedule 07.06.2012
comment
Какую внешнюю библиотеку я должен загрузить, чтобы использовать этот ListMultimap?   -  person Mellon    schedule 07.06.2012
comment
хороший вопрос, и действительно полезный. я только что нашел то, что хотел. впервые я столкнулся с Multipmap-s и LinkedListMultimap от Guava. Пожалуйста, откройте этот вопрос повторно   -  person Peter Perháč    schedule 12.11.2014


Ответы (6)


Я бы использовал реализацию гуавы 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]}
person dacwe    schedule 07.06.2012

Фрагмент ниже должен помочь вам.

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 );
person Vipul    schedule 07.06.2012

Итерация по объектам. Для каждого объекта получите соответствующий список с карты. Если ноль, создайте новый список и поместите его на карту. Затем добавьте значение в список.

Или используйте Guava. ListMultimap, который сделает это за вас.

person JB Nizet    schedule 07.06.2012
comment
Какую внешнюю библиотеку я должен загрузить, чтобы использовать этот ListMultimap? - person Mellon; 07.06.2012
comment
Эээ... Гуава, конечно. Вот почему я сказал ListMultimap Гуавы. - person JB Nizet; 07.06.2012

Что-то вроде этого, наверное?

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. .

person Buhake Sindi    schedule 07.06.2012

person    schedule
comment
Это сработало как чудо для меня. Большое спасибо! - person Vineela Thonupunuri; 31.05.2019

person    schedule
comment
@ scarba05, я привожу только пример данных, это не значит, что данные такие, на самом деле данные довольно рандомные, но в таком формате. Если это так же просто, как ваш ответ, я не буду спрашивать здесь - person Mellon; 07.06.2012