如何在 java 中创建类似于 python 字典的字典并一次输入多个值?
How do I create a dictionary in java similar to the python dictionary and input multiple values at once?
graph = {1:{'a','b'},2:{'c','d'},3:{'e','f'},4:{'g','h'},5:{'b','d'},6:{'b','e'},7:{'a','c'},8:{'f','h'},9:{'e','g'}}
我做了什么:
public class Try {
public static void main(String[] args) {
Set<Character> universal = new HashSet<>();
Collections.addAll(universal, 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h');
// System.out.println(universal);
HashMap<Integer, HashSet<Character>> graph =
new HashMap<Integer, HashSet<Character>>();
HashSet<Character> values = new HashSet<Character>();
Collections.addAll(values, 'a', 'b');
System.out.println(values);
// Output : [a, b]
graph.put(1, values);
System.out.println(graph.get(1));
// Output : [a, b]
System.out.println(graph);
// Output : {1=[a, b]}
values.removeAll(values);
System.out.println(graph.get(1));
// Output : []
// Why did the value clear out from the graph?
System.out.println(graph);
// Output : {1=[]}
}
}
如何一次输入这些值而不是一直使用 put()
函数?难道没有更好的办法吗?此外,解释为什么 clear()
或 remove()
函数在变量 values 上的使用导致它从变量 graph[=23] 中删除的原因=].我希望结构是可变的。
首先,它看起来不像 python 词典。 python 词典的字典将是
{1: {'a': 'b'}, 2: {'c': 'd'}}
元组字典是
{1: ('a', 'b'), 2: ('c', 'd')}
在 Java 中,您 可以 表达为 Map<Integer, Map<Character, Character>>
,(或者可能是 Map<Integer, List<Character>>
,如果这是您的意思)但这会导致非惯用的、繁琐的代码。
由于您的数据结构是连续整数的映射,更好的表示形式是数组:
// Using Java 14 record types ...
public record Pair (char first, char second) {}
Pair[] theMapping = new Pair[]{
null,
new Pair('a', 'b'),
new Pair('c', 'd'),
// etc
};
唯一的问题是 null
... 这是必需的,因为 Java 数组索引从零开始。
这也可以表示为 char[][]
或其他比 Map
的 Map
公式更易于使用(且更有效)的方式。
以下 Python 语句:
graph = {1:{'a','b'},2:{'c','d'},3:{'e','f'},4:{'g','h'},5:{'b','d'},6:{'b','e'},7:{'a','c'},8:{'f','h'},9:{'e','g'}}
可以像这样在 Java 9+ 中实现:
graph = Map.of(1, Set.of("a", "b"),
2, Set.of("c", "d"),
3, Set.of("e", "f"),
4, Set.of("g", "h"),
5, Set.of("b", "d"),
6, Set.of("b", "e"),
7, Set.of("a", "c"),
8, Set.of("f", "h"),
9, Set.of("e", "g"));
结果是 不可变的 Map<Integer, Set<String>>
,不像 Python,结果是可变的。
打印出来,看起来像这样,其中顺序发生了变化,因为 Map
是 HashMap
:
{4=[g, h], 3=[e, f], 2=[c, d], 1=[a, b], 9=[e, g], 8=[f, h], 7=[a, c], 6=[b, e], 5=[b, d]}
因为Java 9
你可以这样实现,结果是可修改:
Map<Integer, Set<Character>> graph = new HashMap<>(Map.of(
1, new HashSet<>(Set.of('a', 'b')),
2, new HashSet<>(Set.of('c', 'd')),
3, new HashSet<>(Set.of('e', 'f')),
4, new HashSet<>(Set.of('g', 'h')),
5, new HashSet<>(Set.of('b', 'd')),
6, new HashSet<>(Set.of('b', 'e')),
7, new HashSet<>(Set.of('a', 'c')),
8, new HashSet<>(Set.of('f', 'h')),
9, new HashSet<>(Set.of('e', 'g'))));
更短的语句,但结果是不可修改:
Map<Integer, Set<Character>> immutable = Map.of(
1, Set.of('a', 'b'),
2, Set.of('c', 'd'),
3, Set.of('e', 'f'),
4, Set.of('g', 'h'),
5, Set.of('b', 'd'),
6, Set.of('b', 'e'),
7, Set.of('a', 'c'),
8, Set.of('f', 'h'),
9, Set.of('e', 'g'));
在早期版本中,由于Java 1.5
,您可以使用这样的语句,结果是可修改:
Map<Integer, Set<Character>> graph = new HashMap();
graph.put(1, new HashSet(Arrays.asList('a', 'b')));
graph.put(2, new HashSet(Arrays.asList('c', 'd')));
graph.put(3, new HashSet(Arrays.asList('e', 'f')));
graph.put(4, new HashSet(Arrays.asList('g', 'h')));
graph.put(5, new HashSet(Arrays.asList('b', 'd')));
graph.put(6, new HashSet(Arrays.asList('b', 'e')));
graph.put(7, new HashSet(Arrays.asList('a', 'c')));
graph.put(8, new HashSet(Arrays.asList('f', 'h')));
graph.put(9, new HashSet(Arrays.asList('e', 'g')));
更短的语句,结果也是 可修改的:
Map<Integer, Set<Character>> graph = new HashMap() {{
put(1, new HashSet(Arrays.asList('a', 'b')));
put(2, new HashSet(Arrays.asList('c', 'd')));
put(3, new HashSet(Arrays.asList('e', 'f')));
put(4, new HashSet(Arrays.asList('g', 'h')));
put(5, new HashSet(Arrays.asList('b', 'd')));
put(6, new HashSet(Arrays.asList('b', 'e')));
put(7, new HashSet(Arrays.asList('a', 'c')));
put(8, new HashSet(Arrays.asList('f', 'h')));
put(9, new HashSet(Arrays.asList('e', 'g')));
}};
另请参阅:
• System.arrayCopy() copies object or reference to object?
•
graph = {1:{'a','b'},2:{'c','d'},3:{'e','f'},4:{'g','h'},5:{'b','d'},6:{'b','e'},7:{'a','c'},8:{'f','h'},9:{'e','g'}}
我做了什么:
public class Try {
public static void main(String[] args) {
Set<Character> universal = new HashSet<>();
Collections.addAll(universal, 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h');
// System.out.println(universal);
HashMap<Integer, HashSet<Character>> graph =
new HashMap<Integer, HashSet<Character>>();
HashSet<Character> values = new HashSet<Character>();
Collections.addAll(values, 'a', 'b');
System.out.println(values);
// Output : [a, b]
graph.put(1, values);
System.out.println(graph.get(1));
// Output : [a, b]
System.out.println(graph);
// Output : {1=[a, b]}
values.removeAll(values);
System.out.println(graph.get(1));
// Output : []
// Why did the value clear out from the graph?
System.out.println(graph);
// Output : {1=[]}
}
}
如何一次输入这些值而不是一直使用 put()
函数?难道没有更好的办法吗?此外,解释为什么 clear()
或 remove()
函数在变量 values 上的使用导致它从变量 graph[=23] 中删除的原因=].我希望结构是可变的。
首先,它看起来不像 python 词典。 python 词典的字典将是
{1: {'a': 'b'}, 2: {'c': 'd'}}
元组字典是
{1: ('a', 'b'), 2: ('c', 'd')}
在 Java 中,您 可以 表达为 Map<Integer, Map<Character, Character>>
,(或者可能是 Map<Integer, List<Character>>
,如果这是您的意思)但这会导致非惯用的、繁琐的代码。
由于您的数据结构是连续整数的映射,更好的表示形式是数组:
// Using Java 14 record types ...
public record Pair (char first, char second) {}
Pair[] theMapping = new Pair[]{
null,
new Pair('a', 'b'),
new Pair('c', 'd'),
// etc
};
唯一的问题是 null
... 这是必需的,因为 Java 数组索引从零开始。
这也可以表示为 char[][]
或其他比 Map
的 Map
公式更易于使用(且更有效)的方式。
以下 Python 语句:
graph = {1:{'a','b'},2:{'c','d'},3:{'e','f'},4:{'g','h'},5:{'b','d'},6:{'b','e'},7:{'a','c'},8:{'f','h'},9:{'e','g'}}
可以像这样在 Java 9+ 中实现:
graph = Map.of(1, Set.of("a", "b"),
2, Set.of("c", "d"),
3, Set.of("e", "f"),
4, Set.of("g", "h"),
5, Set.of("b", "d"),
6, Set.of("b", "e"),
7, Set.of("a", "c"),
8, Set.of("f", "h"),
9, Set.of("e", "g"));
结果是 不可变的 Map<Integer, Set<String>>
,不像 Python,结果是可变的。
打印出来,看起来像这样,其中顺序发生了变化,因为 Map
是 HashMap
:
{4=[g, h], 3=[e, f], 2=[c, d], 1=[a, b], 9=[e, g], 8=[f, h], 7=[a, c], 6=[b, e], 5=[b, d]}
因为Java 9
你可以这样实现,结果是可修改:
Map<Integer, Set<Character>> graph = new HashMap<>(Map.of(
1, new HashSet<>(Set.of('a', 'b')),
2, new HashSet<>(Set.of('c', 'd')),
3, new HashSet<>(Set.of('e', 'f')),
4, new HashSet<>(Set.of('g', 'h')),
5, new HashSet<>(Set.of('b', 'd')),
6, new HashSet<>(Set.of('b', 'e')),
7, new HashSet<>(Set.of('a', 'c')),
8, new HashSet<>(Set.of('f', 'h')),
9, new HashSet<>(Set.of('e', 'g'))));
更短的语句,但结果是不可修改:
Map<Integer, Set<Character>> immutable = Map.of(
1, Set.of('a', 'b'),
2, Set.of('c', 'd'),
3, Set.of('e', 'f'),
4, Set.of('g', 'h'),
5, Set.of('b', 'd'),
6, Set.of('b', 'e'),
7, Set.of('a', 'c'),
8, Set.of('f', 'h'),
9, Set.of('e', 'g'));
在早期版本中,由于Java 1.5
,您可以使用这样的语句,结果是可修改:
Map<Integer, Set<Character>> graph = new HashMap();
graph.put(1, new HashSet(Arrays.asList('a', 'b')));
graph.put(2, new HashSet(Arrays.asList('c', 'd')));
graph.put(3, new HashSet(Arrays.asList('e', 'f')));
graph.put(4, new HashSet(Arrays.asList('g', 'h')));
graph.put(5, new HashSet(Arrays.asList('b', 'd')));
graph.put(6, new HashSet(Arrays.asList('b', 'e')));
graph.put(7, new HashSet(Arrays.asList('a', 'c')));
graph.put(8, new HashSet(Arrays.asList('f', 'h')));
graph.put(9, new HashSet(Arrays.asList('e', 'g')));
更短的语句,结果也是 可修改的:
Map<Integer, Set<Character>> graph = new HashMap() {{
put(1, new HashSet(Arrays.asList('a', 'b')));
put(2, new HashSet(Arrays.asList('c', 'd')));
put(3, new HashSet(Arrays.asList('e', 'f')));
put(4, new HashSet(Arrays.asList('g', 'h')));
put(5, new HashSet(Arrays.asList('b', 'd')));
put(6, new HashSet(Arrays.asList('b', 'e')));
put(7, new HashSet(Arrays.asList('a', 'c')));
put(8, new HashSet(Arrays.asList('f', 'h')));
put(9, new HashSet(Arrays.asList('e', 'g')));
}};
另请参阅:
• System.arrayCopy() copies object or reference to object?
•