Posortowana intersekcja listy i kluczy w mapie

0

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?

0

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)));
0

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

  1. Posortuj mapę i wsadź do implementacji która zachowuje kolejność
  2. Weź .keyset() z tej mapy
  3. 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.

1

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());
0

@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
0

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.

1
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));
     }
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1