我有兩個 Map<String, List> 型別的 Map,我需要比較它們,當我在 List 中獲得不同的值時,我需要使用它們對應的 Map 鍵檢索這些值。這兩個映射如下所示:
Map<String, List<String>> map1 = new TreeMap<>();
Map<String, List<String>> map2 = new TreeMap<>();
map1.put("Column1", Arrays.asList("one", "two", "four"));
map1.put("Column2", Arrays.asList("one", "two", "four"));
map2.put("Column1", Arrays.asList("one", "two", "three"));
map2.put("Column2", Arrays.asList("one", "two", "three"));
比較后,結果應該類似于:“Key 1 處的不同值,元素 3。Key 2 處的不同值,元素 3”。如何遍歷兩個給定的地圖,以便獲得不同元素的相應索引?我嘗試從每個 Map 中創建一個 flatMap,但隨后我丟失了串列之間不同元素的 keySet。
uj5u.com熱心網友回復:
有很多方法可以進行比較(例如,順序很重要?如果不是,請Set改用List)。
比較“不同元素的對應索引”的一種方法是:
Map<String, List<String>> diffs = Streams.concat(xs.keySet().stream(), ys.keySet().stream())
.distinct()
.collect(toMap(k -> k, k -> {
List<String> x = xs.getOrDefault(k, emptyList());
List<String> y = ys.getOrDefault(k, emptyList());
return IntStream.range(0, Math.max(x.size(), y.size()))
.mapToObj(i -> i < x.size() ? (i < y.size() ? (x.get(i).equals(y.get(i)) ? "=": "<>"): "X") : "Y")
.collect(toList());
}));
=如果索引處的元素i相等,<>如果不同,X或者Y該索引僅存在于一個集合中,您會得到哪里。
例如:
xs.put("Column1", Arrays.asList("one", "xxx", "four"));
xs.put("Column2", Arrays.asList("one", "two"));
xs.put("Column3", Arrays.asList("cat"));
ys.put("Column1", Arrays.asList("one", "two", "four"));
ys.put("Column2", Arrays.asList("one", "two", "three"));
ys.put("Column4", Arrays.asList("apple"));
帶輸出
{ Column1=[=, <>, =]
, Column2=[=, =, Y]
, Column3=[X]
, Column4=[Y]
}
uj5u.com熱心網友回復:
這是一種方法。在不知道您的資料的性質的情況下,至少提及邊界案例很重要。
- 首先,您的示例暗示您正在做位置差異。所以
"one","two"將不同于"two","one"并因此被標記為elements 0, 1不同。 - 地圖可能有不同的鍵。這意味著對于任何給定的鍵,缺少鍵的映射內容都是不同的。
- 對應鍵的串列可以具有不同數量的元素。前幾個可能是一樣的。標記任何缺少的元素,而不僅僅是不同的元素。
這是資料
Map<String, List<String>> map1 = new TreeMap<>();
Map<String, List<String>> map2 = new TreeMap<>();
map1.put("Column1", Arrays.asList("one", "two", "four"));
map1.put("Column2", Arrays.asList("one", "two", "four"));
map1.put("Column3", Arrays.asList("three", "two"));
map1.put("Column4", Arrays.asList("one","two","three"));
map1.put("Column6", Arrays.asList("nine","ten"));
map2.put("Column1", Arrays.asList("one", "two", "three"));
map2.put("Column2", Arrays.asList("one", "two", "three","four","five"));
map2.put("Column3", Arrays.asList("three"));
map2.put("Column4", Arrays.asList("one", "two","three"));
map2.put("Column5", Arrays.asList("one", "two","three"));
現在創建一個包含兩個映射的所有鍵的集合。排序不是必需的,但可以更輕松地與資料進行比較。
SortedSet<String>keySet = new TreeSet<>(map1.keySet());
keySet.addAll(map2.keySet());
- 首先,通過創建一個空串列來防止空串列(用于丟失的鍵)。
- 遍歷串列,比較相同鍵的值。
- 如果不同,呼叫輔助方法獲取不同的索引
- 顯示資訊。
for (String key : keySet) {
List<String>list1 = Objects.requireNonNullElse(map1.get(key), List.of());
List<String>list2 = Objects.requireNonNullElse(map2.get(key), List.of());
if (!list1.equals(list2)) {
int[] diffs = getIndices(list1,list2);
System.out.printf("Maps different at key '%s', element(s) %s", key, diffs[0]);
for (int i = 1; i < diffs.length; i ) {
System.out.printf(", %s", diffs[i]);
}
System.out.println();
}
}
以上印
Maps different at key 'Column1', element(s) 2
Maps different at key 'Column2', element(s) 2, 3, 4
Maps different at key 'Column3', element(s) 1
Maps different at key 'Column5', element(s) 0, 1, 2
Maps different at key 'Column6', element(s) 0, 1
輔助方法。
- 計算串列的最小和最大大小
- 流式傳輸最大串列的索引。
- 如果索引在兩個串列范圍內,則進行比較
- 如果比較不同,則傳遞索引。
- 如果索引超出范圍,則傳遞它,因為它會標記缺失的串列項。
- 然后回傳索引陣列
public static <T> int[] getIndices(List<T> list1,
List<T> list2) {
int min = Math.min(list1.size(), list2.size());
int max = Math.max(list1.size(), list2.size());
int[] diffs = IntStream.range(0, max)
.filter(i -> i >= min || !list1.get(i).equals(list2.get(i)))
.toArray();
return diffs;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/354181.html
