Czy jest możliwe uzyskanie subSet filtrowania kolekcji przez jakiś komparator i czy każda aktualizacja w kolekcji nadrzędnej i jej podzestawach powoduje wszystkie zmiany?Uzyskaj zestaw subset zestawu za pomocą kompilatora
Odpowiedz
Połączenie NavigableSet.subSet()
może zrobić, co chcesz. NavigableSet
to posortowany zestaw, który ma możliwość tworzenia podzbiorów, które są "widokami" zestawu podstawowego. Widoki te są ograniczone wartościami, które podajesz, korzystając z Comparator
dostarczonego podczas tworzenia zestawu lub z naturalnej kolejności wartości. Najczęstszą implementacją jest TreeSet
. Na przykład, można to zrobić:
NavigableSet<String> set = new TreeSet<>(
Arrays.asList("b", "e", "a", "d", "c"));
System.out.println(set);
Rezultatem jest [a, b, c, d, e]
jak można się spodziewać. Teraz można tworzyć podzbiór, na przykład od „b” do „D” włącznie:
NavigableSet<String> set2 = set.subSet("b", true, "d", true);
System.out.println(set2);
Tutaj wyjście jest [b, c, d]
. Teraz, jeśli dodać kilka elementów do oryginalnego zestawu, które są zarówno wewnątrz jak i poza granicami, widok podzbiór zmiany obejmują jedynie to, co zostało dodane do środka:
set.add("a1");
set.add("c1");
set.add("e1");
System.out.println(set2);
Wyjście jest [b, c, c1, d]
.
Ok, a ja chcę utworzyć subSet nie z dostarczaniem od "b" do "d", ale przez jakiś komparator, tj. SubSet, który wybiera dla mnie co sekundę. Zakładam, że wybór nie ciągłego jest trudny, więc nie ma takiego generycznego contairnera. Ale jeśli TreeSet ma np. Komparator, który dzieli elementy na, np. Nieparzyste i parzyste. Chcę subSet pierwszej części lub sekundy przy użyciu tego komparatora. – userbb
@userbb OK, nie sądzę, że kompilator TreeSet może zrobić to, co chcesz. Komparator ustanawia * całkowite zamówienie * wszystkich elementów w zestawie i jest to ustalona właściwość zestawu ustalona w czasie tworzenia. Nie można na przykład ustawić go w ramach operacji zapytania. Wygląda na to, że potrzebujesz czegoś bardziej przypominającego filtr z predykatem, ale myślę, że musisz dokładniej wyjaśnić swój przypadek użycia. Ja i inni robimy sporo zgadywania. –
Czy chcesz dodać rodzaj "wyzwalacza" do swojej kolekcji, która filtruje elementy dodawane do Twojej listy? –
Nie sądzę, że można to zrobić w przypadku zwykłej kolekcji, ponieważ klasa musiałaby implementować jakiś obserwowalny interfejs. Albo to, albo musisz przetestować cały element za każdym razem, na wypadek gdyby coś zmieniło się w oryginalnej kolekcji. –
Czy 'NavigableSet.subSet()' robi to, co chcesz? –