【问题标题】:how to convert List<List<String>> into hashmap?如何将 List<List<String>> 转换为 hashmap?
【发布时间】:2015-09-28 01:43:59
【问题描述】:

我有一个 ArrayList,它在每行中存储键和值(例如,第一行将没有,名字,姓氏,年龄,第二行将有 1,xxx,yyy,23,第三行将有 2,aaa, bbb,24 等等)。第一行具有所有键,其余行将具有值。 我想将其转换为哈希图(例如,键应该是名字,值应该是 xxx,aaa)。 有没有办法做到这一点??

【问题讨论】:

  • 你到底尝试了什么?
  • 是的,有办法。到目前为止你做了什么?
  • 您希望这些条目采用哪种格式?一个 HashMap 列表,每个都包含一行的键值关联,还是一个 HashMap,键后面有一个值列表?

标签: java arraylist hashmap


【解决方案1】:

鉴于List&lt;List&lt;String&gt;&gt; 变量可以以两种方式扩展(例如,您可以使列表更长,但您也可以使列表中的列表更长),并且鉴于HashMap 基本上具有固定尺寸(一个key 指向一个值,而不是多个值),唯一的方法是创建一个包含列表数据的新对象,并让 key 指向该对象。

【讨论】:

    【解决方案2】:

    这会返回一个 HashMap 列表,这意味着对于每个值行,您都会获得一个键值结构:

    static List<HashMap<String, String>> listToMap(List<List<String>> lst){
      List<HashMap<String, String>> lmap = new ArrayList<>();
      List<String> keys = lst.get(0);
      for(int row=1;row<lst.size();row++){
        List<String> currentRow = lst.get(row);
        HashMap<String, String> kvRow = new HashMap<String, String>();
        for(int i=0;i<keys.size();i++){
          kvRow.put(keys.get(i), currentRow.get(i));
        }
        lmap.add(kvRow);
      }
      return lmap;
    }
    

    如果您使用示例数据运行它...

    public static void main(String[] args) {
      List<List<String>> lst = new ArrayList<>(3);
      lst.add(Arrays.asList("no","firstname","lastname","age"));
      lst.add(Arrays.asList("1","xxx","yyy","23"));
      lst.add(Arrays.asList("2","aaa","bbb","24"));
      System.out.println(listToMap(lst));
    }
    

    打印出来

    [{no=1, age=23, lastname=yyy, firstname=xxx}, {no=2, age=24, lastname=bbb, firstname=aaa}]
    

    这是你想要的方式吗?此代码假定所有值行的值至少与“键”行一样多。

    【讨论】:

      【解决方案3】:

      假设您在范围内的某处定义了以下列表:

      List<List<String>> keyValueList; 
      

      首先,轮询列表以获取标题。

      List<String> headers = keyValueList.get(0);
      

      然后,您可以使用 ListIterator 迭代所有值。

      Map<String, String> myMap = new HashMap<String, String>(headers.size());
      ListIterator<List<String>> valueLists = keyValueList.listIterator(1);
      
      while(valueLists.hasNext()){
          Iterator<String> values = valueLists.next().iterator();
          Iterator<String> keys = headers.iterator();
          myMap.put(keys.next(), values.next());
      }
      

      然后你就完成了。

      【讨论】:

      • 每个值列表都会覆盖地图中以前的值。
      【解决方案4】:

      因为您使用的是有序的 ArrayList,您可能希望使用像 LinkedHashMap 这样的有序映射,它会保留您插入它们的顺序。

      List<List<String>> inputList;
      LinkedHashMap<String, List<String>> map = new LinkedHashMap<String, List<String>>();
      int nEntries = inputList.get(0).size();
      
      String thisKey;
      List<String> thisList;
      
      for(int index = 0; i < nEntries; i++){ //iterate over all column indexes
      
          for(List<String> thisRow:inputList){
              //if this is the first row, this is our key.
              if(inputList.indexOf(thisRow) == 0){
                  thisKey = thisRow.get(index);
                  thisList.clear();
              }
              else{
                  thisList.add(thisRow.get(index);
              }
          }
          map.put(thisKey,thisList);
      
      }
      

      【讨论】:

      • 这不是答案...而且这也不正确...他不需要这里的有序地图...
      猜你喜欢
      • 1970-01-01
      • 2016-06-27
      • 1970-01-01
      • 2020-01-11
      • 2013-08-26
      • 2011-07-24
      • 2020-11-27
      • 2018-07-16
      • 2021-09-17
      相关资源
      最近更新 更多