【问题标题】:How to save list value in Map in Java?如何在 Java 中的 Map 中保存列表值?
【发布时间】:2021-07-12 18:41:09
【问题描述】:

我有一个字符串映射和字符串列表, 这是我的字符串

Name|A|B|D
Last|C|F|G|H
Map<String , List<String>> edited = new LinkedHashMap<>();
for(String s : data){
    String[] split = s.split("\\|");    
    for(int i = 1; i < split.length; i++){
        partValue.add(split[i]);
    }
    edited.put(split[0], partValue);
    partValue.clear();
}

当第二个for循环后partValue被清除时,地图列表值大小也变为0。我不希望地图列表值受到影响。

我正在尝试存储

名称 -> ["A", "B", "D"]

最后 -> ["C", "F", "G", "H"]

【问题讨论】:

  • 你在哪里实例化partValue?将其带入 for 循环而不是清除
  • 不要重复使用partValue。为每个项目创建一个新列表。
  • 一般而言,不要重复使用不应该是“同一事物”的对象。

标签: java


【解决方案1】:

不要重复使用partValue,但始终为edited 映射中的每个条目每行创建一个新的..

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

for(String s : data){
    String[] split = s.split("\\|"); 

    // Always initialize new list for every line
    List<String> partValue = new ArrayList<>(split.size() - 1);
   
    for(int i = 1; i < split.length; i++){
        partValue.add(split[i]);
    }

    edited.put(split[0], partValue);
}

【讨论】:

    【解决方案2】:

    由于edited 映射包含对partValue 列表的引用,清除它还会导致删除您之前添加的列表元素(但引用仍将存在于映射中)。因此,这将导致错误的结果。 您可以尝试以下方法:

        edited.put(split[0], partValue);
        partValue = new ArrayList<String>();
    

    【讨论】:

      【解决方案3】:

      当然,您也可以简化循环:

              for (String s : data) {
                  String[] split = s.split("\\|");
                  List<String> partValue = new ArrayList<>(Arrays.asList(split));
                  edited.put(partValue.remove(0), partValue);
              }
      

      【讨论】:

      • 但是为了换取更差的性能,因为您将数组转换为不可变列表,然后转换为 ArrayList,然后将整个 ArrayList 向左移动一位。
      • 没错,是的
      • 快到了 .. 试试edited.put(split[0], Arrays.copyOfRange(split, 1, split.length)
      • 是的,我觉得这样更好
      猜你喜欢
      • 2019-07-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多