我在Java中有两个列表:
List<String> ENODE = Arrays.asList(
"ENB1", "ENB2", "ENB3", "ENB4", "ENB5");
List<String> CLOUD = Arrays.asList(
"C1", "C2", "C3", "C4");
我想迭代两个列表中的元素以生成一个哈希映射,它将列表1中的所有元素与列表2中的所有元素配对,产生如下所示:
("ENB1","C1"), ("ENB1","C2"), ("ENB1","C3"),("ENB1","C4")
("ENB2","C1"), ("ENB2","C2"), ("ENB2","C3"),("ENB2","C4")
等等。
我对如何做到这一点有任何想法?
答案 0 :(得分:1)
由于密钥必须是唯一的,因此您无法使用Map
执行您在问题中指定的内容。但是,您可以使用原始String[][]
数组或您自己的“对”dto列表来执行此操作。
public static void main(String[] args) {
List<String> enode = Arrays.asList("ENB1", "ENB2", "ENB3", "ENB4", "ENB5");
List<String> cloud = Arrays.asList("C1", "C2", "C3", "C4");
List<Pair> pairs = new ArrayList<>();
for (String e : enode) {
for (String c : cloud) {
pairs.add(new Pair(e, c));
}
}
System.out.println(pairs);
}
private static class Pair {
final String key;
final String value;
public String getKey() {
return key;
}
public String getValue() {
return value;
}
public Pair(String key, String value) {
super();
this.key = key;
this.value = value;
}
@Override
public String toString() {
return new StringBuilder().append("(").append(this.key).append(",").append(this.value).append(")")
.toString();
}
}
答案 1 :(得分:0)
Map
中的每个键只能指向一个条目,因此您无法拥有Map<String, String>
。但是你可以有Map<String, List<String>>
(“从字符串映射到字符串列表”)。此代码将创建一个映射,其键来自第一个列表,其值是第二个列表中所有值的列表。
public static void main(String[] args) {
List<String> eNode = Arrays.asList("ENB1", "ENB2", "ENB3", "ENB4",
"ENB5");
List<String> cloud = Arrays.asList("C1", "C2", "C3", "C4");
Map<String, List<String>> grouped = groupListsIntoMap(eNode, cloud);
System.out.println("Map:\n" + grouped);
}
public static Map<String, List<String>> groupListsIntoMap(List<String> keys,
List<String> values) {
int size = Math.min(keys.size(), values.size());
Map<String, List<String>> map = new HashMap<>();
for (int keyIndex = 0; keyIndex < keys.size(); ++keyIndex) {
String key = keys.get(keyIndex);
for (int valueIndex = 0; valueIndex < values.size(); ++valueIndex) {
map.computeIfAbsent(key, r -> new ArrayList<>()).add(values.get(
valueIndex));
}
}
return map;
}
这给出了输出:
Map:
{ENB1=[C1, C2, C3, C4],
ENB2=[C1, C2, C3, C4],
ENB3=[C1, C2, C3, C4],
ENB4=[C1, C2, C3, C4],
ENB5=[C1, C2, C3, C4]}
请注意,您应始终声明Java集合的参数类型,例如List
或Map
。这里似乎您的键和值始终为String
,因此我们将列表声明为List<String>
(“字符串列表”)。如果您尝试将非字符串类型添加到列表中,这会强制执行类型安全性并为您提供良好,清晰的编译器错误。
如果ENODE
和CLOUD
是可变变量,那么您应该用小写命名它们,名称如'eNode'或'enode'。这称为Java命名约定,它使您可以更轻松地阅读和查看代码。另一方面,如果这些是static final
类字段,那么给它们一个ALL_UPPERCASE_SEPARATED_BY_UNDERSCORES名称是正确的,以表明它们应该被视为常量(不可变,不可修改)。