将两个不同的列表分成单个映射

时间:2018-03-10 12:46:57

标签: java list hashmap iterator

我在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")

等等。

我对如何做到这一点有任何想法?

2 个答案:

答案 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集合的参数类型,例如ListMap。这里似乎您的键和值始终为String,因此我们将列表声明为List<String>(“字符串列表”)。如果您尝试将非字符串类型添加到列表中,这会强制执行类型安全性并为您提供良好,清晰的编译器错误。

如果ENODECLOUD是可变变量,那么您应该用小写命名它们,名称如'eNode'或'enode'。这称为Java命名约定,它使您可以更轻松地阅读和查看代码。另一方面,如果这些是static final类字段,那么给它们一个ALL_UPPERCASE_SEPARATED_BY_UNDERSCORES名称是正确的,以表明它们应该被视为常量(不可变,不可修改)。