java 中的笛卡尔积与两个哈希图列表<String,String>

Cartesian product in java with two lists of hashmaps<String,String>

我试图在 java 中构建存储在 d3 中的 d1 和 d2 中的笛卡尔积,我收到一个错误,我的 + 不能用于两个 hashmap 条目。我想将 d1 中的每个条目与 d2 中的每个条目连接起来。

public static List<Map<String, String>> cartesianProduct(List<Map<String, String>> d1, List<Map<String, String>> d2) {
    List<Map<String, String>> d3 = new ArrayList<>();

    int s1 = d1.size();
    int s2 = d2.size();

    for (int i = 0; i < s1; i++) {
        for (int j = 0; j < s2; j++) {
            d3.add(d1.get(i) + d2.get(j));
        }
    }

    return d3;
}

我已经走到这一步了,但是我无法将哈希图的内容连接在一起。在这里,我得到了笛卡尔积,但在同一个条目中没有联合。

public static List<Map<String, String>> cartesianProduct(List<Map<String, String>> d1, List<Map<String, String>> d2) {
    List<Map<String, String>> result = new ArrayList<>();

    int s1 = d1.size();
    int s2 = d2.size();

    for (int i = 0; i < s1; i++) {
        for (int j = 0; j < s2; j++) {
            d3.add(d1.get(i));
            d3.add(d2.get(j));
        }
    }

    return d3;
}

示例:

d1 = [{Year = 1976, PersonID = 1},
{Year = 1987, PersonID = 3},
{Year = 1974, PersonID = 2}]

d2 = [{PersonID = 0,houseID = H-101},
{PersonID = 1, houseID = H-202}]

d3 = [{Year = 1976, PersonID = 1,PersonID = 0,houseID = H-101},
{Year = 1976, PersonID = 1,PersonID = 1, houseID = H-202},
{Year = 1987, PersonID = 3,PersonID = 0,houseID = H-101},
{Year = 1987, PersonID = 3,PersonID = 1, houseID = H-202},
{Year = 1974, PersonID = 2,PersonID = 0,houseID = H-101},
{Year = 1974, PersonID = 2,PersonID = 1, houseID = H-202}]

基本上我需要将 d1 和 d2 的值连接到一个条目中,如何做到这一点?

您可以使用Map.putAll,将2张地图合并为一张

public static List<Map<String, String>> cartesianProduct(List<Map<String, String>> d1, 
                                                         List<Map<String, String>> d2) {
    List<Map<String, String>> d3 = new ArrayList<>();
    Map<String, String> map3;

    for (int i = 0; i < d1.size(); i++) {
        for (int j = 0; j < d2.size(); j++) {
            map3 = new HashMap<>();
            map3.putAll(d1.get(i));
            map3.putAll(d2.get(j));
            d3.add(map3);
        }
    }    
    return d3;
}

使用 foreach 循环会更好

Map<String, String> map3;
for (Map<String, String> i : d1) {
    for (Map<String, String> j : d2) {
        map3 = new HashMap<>();
        map3.putAll(i);
        map3.putAll(j);
        d3.add(map3);
    }
}

在您的第一个代码中,您将 d3 声明为(来自(字符串到字符串)的映射)的列表。

List<Map<String, String>> d3 = new ArrayList<>();

然后您尝试添加 2 个字符串的串联,这也是一个字符串(单个字符串)到 d3,它期望添加一个映射。

for (int i = 0; i < s1; i++) {
    for (int j = 0; j < s2; j++) {
        d3.add(d1.get(i) + d2.get(j));
    }
}

在第二段代码中,你声明了一个result,和上面一样,但是仍然引用了d3:

List<Map<String, String>> result = new ArrayList<>();

int s1 = d1.size();
int s2 = d2.size();

for (int i = 0; i < s1; i++) {
    for (int j = 0; j < s2; j++) {
        d3.add(d1.get(i));
        d3.add(d2.get(j));
    }
}

发送之前测试您的代码!

那么,您的示例数据如下所示:

d1 = [{Year = 1976, PersonID = 1},
{Year = 1987, PersonID = 3},
{Year = 1974, PersonID = 2}]

所以有一个包含 3 个 Map 的列表,每个 Map 包含两对 String,第一个元素在每种情况下都是常量“Year”并匹配到一个 int,它被视为 String,第二个常量是“ PersonID"?

这看起来像是一个糟糕的数据结构选择。像个简单的class躲在里面,等着取名:

class PY {int year, int pid}; 

关系 pid、hid (houseId) 的模拟。

所以这可能是 3 个对象的列表和 2 个对象中的第二个对象,很容易组合。也许一张地图(人 -> 年)和一张地图(房子 -> 人) - 我们不知道一个人可能与两所房子有关,还是一所房子与两个人或两者有关。

从头开始一团糟。