- caseInsensitivityDuulates
- Думайте о вложенных картах как о способе создания составного ключа.
- Целое число представляет собой тип данных, которые могут иметь дубликаты,
- первая строка представляет собой версию строки в верхнем регистре
- Последующий набор может содержать любое количество версий ..
.. так что ДЖЕРЕМИ: ['Джереми', 'Джереми', 'ДЖЕРЕМИ'] и т. д. — это правдоподобные данные.
- поэтому данные N1 и n1 будут двумя записями с заглавными буквами N1, и я хочу вернуть их в результаты. .
- У меня есть работать над EntrySet, чтобы хранить ключи/значения вместе. Я это знаю.
- Я хочу вернуть ту же структуру данных, с которой начал (тип caseInsensitivityDuulates).
- Я знаю, что мне нужно фильтр по размеру, превышающему 1.
Из исходных данных так:
1 : N1 : [n1, N1]
1 : N2 : [n2]
Мой ожидаемый результат будет такой структурой данных:
1 : N1 : [n1, N1]
Вот ссылка на работоспособную версию кода
Моя первоначальная попытка в фильтре()< /code> часть Stream должна была использовать:
e -> e.getValue().values().size() > 1
Это просто возвращает все
caseInsensitiveDuplicates.keySet().size(): 1
t1Dups.keySet().size(): 2
k: N1
v: N1
v: n1
k: N2
v: n2
N1 size: 2
N2 size: 1
---
k:N1
v:N1
v:n1
k:N2
v:n2
@Eritrean указал последнее изменение
e -> e.getValue().values().stream().allMatch(set -> set.size() > 1)
вместе с синтаксическим сахаром для Collectors.toMap()
Спасибо за эту часть.
При попытке отладки код в настоящее время печатает:
caseInsensitiveDuplicates.keySet().size(): 1
t1Dups.keySet().size(): 2
k: N1
v: N1
v: n1
k: N2
v: n2
N1 size: 2
N2 size: 1
dupsAllTypes keyset was empty
Я разместил здесь решение без перебора потоковой передачи. Но все же хотелось бы посмотреть, можно ли решить эту проблему более эффективным способом с помощью потоков/фильтров.
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;
import java.util.TreeSet;
import java.util.stream.Collectors;
import static java.lang.System.out;
public class TestDupNameDataStructureFilter {
public static void main(String[] args) {
Map caseInsensitiveDuplicates = new HashMap();
Set n1Set = new TreeSet();
n1Set.add("n1");
n1Set.add("N1");
Set n2Set = new TreeSet();
n2Set.add("n2");
Map m1 = new TreeMap();
m1.put("N1", n1Set);
Map m2 = new TreeMap();
m2.put("N2", n2Set);
Integer nmt = 1;
caseInsensitiveDuplicates.put(nmt, m1);
Map temp = caseInsensitiveDuplicates.get(nmt);
temp.put("N2", n2Set);
caseInsensitiveDuplicates.put(nmt, temp);
out.println("caseInsensitiveDuplicates.keySet().size(): " + caseInsensitiveDuplicates.keySet().size());
Map t1Dups = caseInsensitiveDuplicates.get(nmt);
out.println("t1Dups.keySet().size(): " + t1Dups.keySet().size());
for (String k : t1Dups.keySet()) {
out.println("k: " + k);
for (String v : t1Dups.get(k)) {
out.println("v: " + v);
}
}
out.println("N1 size: " + caseInsensitiveDuplicates.get(nmt).get("N1").size());
out.println("N2 size: " + caseInsensitiveDuplicates.get(nmt).get("N2").size());
Map dupsAllTypes = caseInsensitiveDuplicates
.entrySet()
.stream()
//.filter( e -> e.getValue().values().size() > 1)
.filter( e -> e.getValue().values().stream().allMatch(set -> set.size() > 1) )
.collect( Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue) );
if (dupsAllTypes == null) {
out.println("dupsAllTypes was null");
return;
} else if (dupsAllTypes.keySet().size() == 0) {
out.println("dupsAllTypes keyset was empty");
return;
}
Map dups = dupsAllTypes.get(nmt);
if (dups == null) {
out.println("dups was null");
return;
} else if (dups.keySet().size() == 0) {
out.println("dups keyset was empty");
return;
}
out.println("---");
for (String k : dups.keySet()) {
out.println("k:" + k);
for (String v : dups.get(k) ) {
out.println("v:" + v);
}
}
}
}
Подробнее здесь: https://stackoverflow.com/questions/698 ... itive-dupl