有没有一种方法可以使用Java中已包含的值来初始化SortedMap <Integer,String>?

时间:2020-05-14 20:59:51

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

我想做类似的事情

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

就像您在python中一样,但是在Java中是可能的,还是两次调用.put()的唯一方法?

5 个答案:

答案 0 :(得分:6)

从Java 9开始,您可以这样做:

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

Javadoc链接:

TreeMap(Map<? extends K, ? extends V> m)

Map<K, V> of(K k1, V v1, K k2, V v2)

答案 1 :(得分:2)

根据Java-8Java-14SortedMap的Javadoc,以下内容成立。它读取SortedMap

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

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

  2. 构造函数 带有一个类型为Comparator的单个参数,它将创建一个空的 排序图根据指定的比较器排序。

  3. 构造函数 带有一个类型为Map的单个参数,它将使用 与自变量相同的键值映射,并根据键的排序 自然排序。

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

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

答案 2 :(得分:1)

有双括号初始化器:

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

如果需要,您可以写成一行。

尽管,我不建议这样做。阅读here

答案 3 :(得分:1)

在Java 8中:

%.c

(Yuk)。

答案 4 :(得分:0)

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}