我正在嘗試從 d1 和 d2 在存盤在 d3 中的 java 中構建笛卡爾積,我收到一個錯誤,我的 不能用于兩個哈希圖條目。我想將 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 的值連接到一個條目中,如何做到這一點?
uj5u.com熱心網友回復:
您可以使用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);
}
}
uj5u.com熱心網友回復:
在您的第一個代碼中,您將 d3 宣告為 (Maps from (String to String)) 的串列。
List<Map<String, String>> d3 = new ArrayList<>();
然后您嘗試添加 2 個字串的串聯,這又是一個字串(單個字串)到 d3,它期望添加一個 Map。
for (int i = 0; i < s1; i ) {
for (int j = 0; j < s2; j ) {
d3.add(d1.get(i) d2.get(j));
}
}
在第二個代碼中,您以與上述相同的方式宣告結果,但仍參考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 PY {int year, int pid};
模擬關系 pid, hid (houseId)。
因此,這可以是 3 個物件的串列和 2 個物件中的第二個,很容易組合。也許是一張地圖(人 -> 年)和一張地圖(房子 -> 人)——我們不知道一個人可能與兩所房子有關,還是一所房子與兩個人有關,或者兩者都有。
從頭到尾都是一團糟。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/367466.html
