【问题标题】:Is there a way to initialize a SortedMap<Integer, String> with values already included in Java?有没有办法用 Java 中已经包含的值初始化 SortedMap<Integer, String> ?
【发布时间】:2020-05-14 20:59:51
【问题描述】:

我想做这样的事情

SortedMap<Integer, String> stuff = new TreeMap<Integer, String>({1:"a",2:"b"});

很像您在 python 中所做的,但在 Java 中是否可能,或者是调用 .put() 两次的唯一方法?

【问题讨论】:

    标签: java data-structures java-8 initialization sortedmap


    【解决方案1】:

    启动 Java 9,你可以这样做:

    SortedMap<Integer, String> stuff = new TreeMap<>(Map.of(1, "a", 2, "b"));
    

    Javadoc 链接:

    TreeMap(Map&lt;? extends K, ? extends V&gt; m)

    Map&lt;K, V&gt; of(K k1, V v1, K k2, V v2)

    【讨论】:

    【解决方案2】:

    根据来自Java-8Java-14SortedMap 的Javadoc,以下情况成立。它读取SortedMap

    所有排序地图的预期“标准”构造函数 实现是:

    1. 一个 void(无参数)构造函数,它创建一个空的排序映射 根据其键的自然顺序排序。

    2. 构造函数 带有Comparator 类型的单个参数,这会创建一个空的 sorted map 根据指定的比较器排序。

    3. 构造函数 使用Map 类型的单个参数,它创建一个新的地图 与其参数相同的键值映射,根据键排序 自然排序。

    4. 具有单个参数类型的构造函数 SortedMap,创建一个具有相同键值的新排序图 映射和与输入排序映射相同的顺序。

    (3) 的基础上,您可以简单地初始化一个SortedMap 实现,将另一个Map 初始化包装为构造函数参数。这个Q&A 中有很多选项与这里的其他建议相匹配。

    【讨论】:

      【解决方案3】:

      有双括号初始化器:

      Map stuff = new TreeMap<Integer, String>() {{
          put(1, "a");
          put(2, "b");
      }};
      System.out.println(stuff);
      

      如果你愿意,你可以写成一行。

      虽然,我不建议这样做。阅读here

      【讨论】:

      • 没有人应该像这样初始化地图 :) 不值得可读性的好处。
      • @MAnouti,是的。我确实提到过。但它提供了一种调用 put 两次的方法。链接的答案足以解释为什么不应该使用它。
      • @MAnouti 实际上,它甚至没有可读性优势。与Map&lt;Integer, String&gt; stuff = new TreeMap&lt;&gt;(); stuff.put(1, "a"); stuff.put(2, "b"); 没有显着区别,由于双大括号构造是创建子类,因此您必须重复 Java 8 中的类型参数,这使得双大括号构造更长……
      【解决方案4】:

      在 Java 8 中:

      Stream.of(new SimpleEntry<>(1, "a"), new SimpleEntry<>(2, "b"))
          .collect(
              Collectors.toMap(
                  Entry::getKey, Entry::getValue,
                  (a, b) -> { throw new IllegalStateException(); },
                  TreeMap::new);
      

      (呸)。

      【讨论】:

        【解决方案5】:

        answer by M Anouti 最多只能容纳 10 个条目。如果要超过10个条目,则需要使用Map.ofEntries(Map.entry(k, v), Map.entry(k, v) ...),如下所示:

        import static java.util.Map.entry;
        
        import java.util.Map;
        import java.util.SortedMap;
        import java.util.TreeMap;
        
        public class Main {
            public static void main(String[] args) {
                SortedMap<Integer, String> stuff = new TreeMap<>(
                        Map.ofEntries(entry(1, "a"), entry(2, "b"), entry(3, "c"), entry(4, "d"), entry(5, "e"), entry(6, "f"),
                                entry(7, "g"), entry(8, "h"), entry(9, "i"), entry(10, "j"), entry(11, "k"), entry(12, "l")));
                System.out.println(stuff);
            }
        }
        

        输出:

        {1=a, 2=b, 3=c, 4=d, 5=e, 6=f, 7=g, 8=h, 9=i, 10=j, 11=k, 12=l}
        

        【讨论】:

          猜你喜欢
          • 2022-11-12
          • 2014-10-01
          • 2012-10-09
          • 1970-01-01
          • 1970-01-01
          • 2021-02-26
          • 1970-01-01
          • 1970-01-01
          • 2016-11-13
          相关资源
          最近更新 更多