【问题标题】:How can I LowerCase all the HashMap's values?如何小写所有 HashMap 的值?
【发布时间】:2020-03-05 18:32:10
【问题描述】:

我有一个Map<String,Map<String,String>>,我想将每个键和值都小写。使用以下代码,我可以这样做,但我的数据结构会发生变化。我该如何解决这个问题?

for (Map.Entry<String, Map<String, String>> t : list.entrySet()) {
    for (Map.Entry<String, String> e : t.getValue().entrySet()) {
        lowerCaseList1.put(t.getKey().toLowerCase().trim(), lowerCaseList2.put(e.getValue().toLowerCase().trim(), e.getKey().toLowerCase().trim()));
    }
}

【问题讨论】:

  • 您在名为list 的变量中有Map?这令人困惑!!!
  • 你的数据结构?这意味着什么? HashMap 是无序的。如果您想保留排序,请使用TreeMapLinkedHashMap
  • 最明显的解决方案是创建一个具有适当大小写的新地图。就地更改意味着您需要处理很多极端情况。
  • 如果你想将字符串转换为大写,你为什么要调用toLowerCase()
  • @Andreas Typo,我的错

标签: java string hashmap


【解决方案1】:

要将Map&lt;String,Map&lt;String,String&gt;&gt; 中的所有 3 个字符串转换为大写1,请创建一个新映射。

Map<String,Map<String,String>> input = Map.of("abc", Map.of("Def", "Ghi"),
                                              "jkl", Map.of("MNO", "PQR", "stu", "vwx"));

Map<String,Map<String,String>> output = input.entrySet().stream()
        .collect(Collectors.toMap(
                e1 -> e1.getKey().toUpperCase(),
                e1 -> e1.getValue().entrySet().stream().collect(Collectors.toMap(
                        e2 -> e2.getKey().toUpperCase(),
                        e2 -> e2.getValue().toUpperCase()))));

System.out.println(input);
System.out.println(output);

输出

{abc={Def=Ghi}, jkl={stu=vwx, MNO=PQR}}
{ABC={DEF=GHI}, JKL={STU=VWX, MNO=PQR}}

注意:如果有 2 个键在大写时变为相同,则代码将失败并显示 IllegalStateException: Duplicate key

Map<String,Map<String,String>> input = Map.of("aaa", Map.of("bbb", "ccc", "Bbb", "Ccc"));

输出

java.lang.IllegalStateException: Duplicate key BBB (attempted merging values CCC and CCC)

1) 问题最初要求大写,但后来改为要求小写。保持答案不变,因为展示如何更改大小写并不重要。

【讨论】:

    【解决方案2】:

    除了@Andreas 提供的优雅解决方案,您还可以按以下方式进行:

    import java.util.LinkedHashMap;
    import java.util.Map;
    import java.util.Map.Entry;
    
    public class Main {
        public static void main(String[] args) {
            Map<String, Map<String, String>> map = Map.of("Map1", Map.of("tEst1", "VALUE1", "test2", "VAlue2"), "MaP2",
                    Map.of("TEST3", "value3", "Test4", "Value4"));
            System.out.println(map);
    
            Map<String, Map<String, String>> tempOuter = new LinkedHashMap<String, Map<String, String>>();
            Map<String, String> tempInner;
    
            for (Entry<String, Map<String, String>> outerEntry : map.entrySet()) {
                tempInner = new LinkedHashMap<String, String>();
                for (Entry<String, String> innerEntry : outerEntry.getValue().entrySet()) {
                    tempInner.put(innerEntry.getKey().toLowerCase(), innerEntry.getValue().toLowerCase());
                }
                tempOuter.put(outerEntry.getKey().toLowerCase(), tempInner);
            }
    
            map = new LinkedHashMap<String, Map<String, String>>();
            map.putAll(tempOuter);
            System.out.println(map);
        }
    }
    

    输出:

    {Map1={test2=VAlue2, tEst1=VALUE1}, MaP2={TEST3=value3, Test4=Value4}}
    {map1={test2=value2, test1=value1}, map2={test3=value3, test4=value4}}
    

    【讨论】:

      猜你喜欢
      • 2017-05-04
      • 2011-10-24
      • 1970-01-01
      • 2020-08-24
      • 1970-01-01
      • 2018-10-20
      • 1970-01-01
      • 2014-04-13
      • 2013-07-25
      相关资源
      最近更新 更多