Mam List<Integer>
oraz Map<Integer, Integer>
i czy jakioś mogę wykorzystać strumień aby wyciągnąc tylko takie same wartości które występuje i w List
i kluczu Map
, a następnie posortować je po wartości z Map
? W sumie może być najpierw posortowane później dopiero wyciagnięte te same wartości?
Możesz za pomocą streama przeiterować po liście i wyfiltrować po kluczu z mapy (containsKey) a na koniec wynikową listę możesz posortować za pomocą np:
wspolneWartosci.sort((a, b) -> Integer.compare(mapa.get(a), mapa.get(b)));
Czyli chcesz zwrócić posortowaną intersekcję listy i kluczy w mapie? Tylko że posortowana po wartościach w mapie?
No to najprościej byłoby
- Posortuj mapę i wsadź do implementacji która zachowuje kolejność
- Weź
.keyset()
z tej mapy - Wykonaj
.retainAll()
na liście
To ma tą zaletę że raz posortowaną mapę, możesz potem używać z wieloma listami, i nie trzeba jej sortować dla każdej listy z osobna (jeśli byś tego potrzebował). Oczywiście to mikrooptymalizacja, chyba że masz na prawdę duże te listy.
Właśnie tego typu case'y są powodem, dla których lubię streamy:
List<Integer> list = getList();
Map<Integer, Integer> map = getMap();
List<Integer> result = list.stream()
.filter(map::containsKey) // filtrujemy co jest w mapie
.sort(Comparator.comparingInt(map::get)) // sortujemy po wartości w mapie - od najniższej do najwyższej
.collect(Collectors.toList());
@wartek01 @RequiredNickname Ok będzie jedna spora zmina. Ten moduł jest na Java 6 więc teraz mam zagowstękę jak to zrobić na javie 6. Podam przykład
List<Integer> list = new ArrayList<Integer>();
list.add(05);
list.add(10);
Map<Integer, Integer> piorytet = new HashMap<Integer, Integer>();
piorytet.put(01, 3);
piorytet.put(05, 2);
piorytet.put(10, 1);
I teraz potrzebuje wyciągnac w takiej kolejności o innej kolekcji:
10, 1
05, 2
W takim razie stwórz własny Comparator<Integer>
, który w konstruktorze przyjmie mapę, a filtrowanie ogarnij przez retainAll
. Wtedy:
List<Integer> list = getList();
Map<Integer, Integer> map = getMap();
list.retainAll(map.keySet());
Comparator<Integer> comparator = new MapValueComparator(map);
Collections.sort(list, comparator);
Jeśli nie chcesz modyfikować list
(ewentualnie implementacja twojej listy nie obsługuje retainAll
) to możesz przepisać to do nowej listy wynikowej.
Map<Integer, Integer> result = new HashMap<Integer, Integer>();
for (Integer i: list){
if(priorytet.containsKey(i) && priorytet.get(i)!=null && priorytet.get(i)>0){
result.put(i, priorytet.get(i));
}
}