【问题标题】:How to achieve this Map<String, List<>> structure [closed]如何实现这个 Map<String, List<>> 结构
【发布时间】:2012-06-07 08:07:36
【问题描述】:

我有如下数据:

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

fruit       apple
fruit       banana

computer    acer
computer    asus
computer    ibm 
...

(以上每一行数据都是一个对象,字段为“key”和“value”,都在一个ListList&lt;DataObject&gt;

我想将数据构造为Map&lt;String, List&lt;String&gt;&gt;,如下所示:

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

如何从数据对象中实现上述Map结构?

******另外** ****

我更感兴趣的是使用纯 JDK 提供的类或接口来实现结果,而不是使用外部库。有什么帮助吗?

【问题讨论】:

  • 您已经解释了它的外观 (Map&lt;String, List&lt;String&gt;&gt;)。你的意思是如何实现它?另外,这些数据存储在哪里以及以什么格式存储?
  • @ adarshr ,由于数据列表具有随机长度(可能有很多这种数据),我需要一种通用的方法来构造 Map 结构..我不知道该怎么做
  • 这些数据存储在哪里/如何存储? CSV?数据库? XML? JSON?
  • @adarshr,正如我所提到的,我已经将数据作为列表 List ,每个 DataObject 代表具有“key”和“value”字段的一行
  • 您可以使用 Google Guava 集合中的 ListMultimap。 docs.guava-libraries.googlecode.com/git/javadoc/com/google/…

标签: java data-structures multimap multi-mapping


【解决方案1】:
    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());
    }

【讨论】:

  • 这对我来说是一个奇迹。非常感谢!
  • 我收到以下错误:"DataObject cannot be resolved to a type".
【解决方案2】:

我会使用番石榴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]}

【讨论】:

    【解决方案3】:
    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"));
    

    【讨论】:

    • @scarba05,我只是把数据做个例子,不代表数据是这样的,实际上数据是很随机的,但是是那种格式的。如果和你的回答一样简单,我这里就不问了
    【解决方案4】:

    下面的 sn-p 应该可以帮到你。

    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 );
    

    【讨论】:

      【解决方案5】:

      遍历对象。对于每个对象,从地图中获取其对应的列表。如果为 null,则创建一个新列表并将其放入地图中。然后将该值添加到列表中。

      或使用Guava's ListMultimap,它将为您完成此操作。

      【讨论】:

      • 我应该下载什么外部库才能使用这个 ListMultimap ?
      • 错误...当然是番石榴。这就是我说 Guava 的 ListMultimap 的原因。
      【解决方案6】:

      大概是这样的吧?

      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

      【讨论】:

        猜你喜欢
        • 2018-06-19
        • 1970-01-01
        • 1970-01-01
        • 2020-07-10
        • 2017-01-08
        • 1970-01-01
        • 2020-07-14
        • 1970-01-01
        • 2021-10-01
        相关资源
        最近更新 更多