2

我想做这样的事情

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

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

4

5 回答 5

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)

于 2020-05-14T21:02:32.747 回答
2

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

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

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

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

  3. 具有类型的单个参数的构造函数Map,它创建一个具有与其参数相同的键值映射的新映射,并根据键的自然顺序进行排序。

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

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

于 2020-05-15T02:06:38.373 回答
1

有双括号初始化器:

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

如果需要,您可以将其写在一行中。

虽然,我不推荐这个。在这里阅读。

于 2020-05-14T21:04:32.180 回答
1

在 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);

(玉)。

于 2020-05-14T21:39:40.317 回答
0

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}
于 2020-05-14T22:21:54.543 回答