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 个对象中的第二个对象,很容易组合。也许一张地图(人 -> 年)和一张地图(房子 -> 人) - 我们不知道一个人可能与两所房子有关,还是一所房子与两个人或两者有关。
从头开始一团糟。
我试图在 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 个对象中的第二个对象,很容易组合。也许一张地图(人 -> 年)和一张地图(房子 -> 人) - 我们不知道一个人可能与两所房子有关,还是一所房子与两个人或两者有关。
从头开始一团糟。