È possibile ottenere un sottoset del filtro di raccolta da parte di un comparatore e ogni aggiornamento sulla raccolta principale e i suoi sottogruppi ottengono tutte le modifiche?Ottieni sottoset del set utilizzando il comparatore
risposta
La chiamata NavigableSet.subSet()
potrebbe fare ciò che si desidera. NavigableSet
è un set ordinato che ha la capacità di creare sottoinsiemi che sono "viste" del set sottostante. Queste viste sono limitate dai valori forniti dall'utente, utilizzando lo Comparator
fornito alla creazione del set o l'ordine naturale dei valori. L'implementazione più comune è TreeSet
. Ad esempio, si può fare questo:
NavigableSet<String> set = new TreeSet<>(
Arrays.asList("b", "e", "a", "d", "c"));
System.out.println(set);
Il risultato è [a, b, c, d, e]
come ci si aspetterebbe. Ora è possibile creare un sottoinsieme, ad esempio da "B" a "D" inclusivo:
NavigableSet<String> set2 = set.subSet("b", true, "d", true);
System.out.println(set2);
Qui l'uscita è [b, c, d]
. Ora, se si aggiungono alcuni elementi per la serie originale che sono sia all'interno che all'esterno dei confini, la vista cambia sottoinsieme per includere solo ciò che è stato aggiunto all'interno:
set.add("a1");
set.add("c1");
set.add("e1");
System.out.println(set2);
l'uscita è [b, c, c1, d]
.
Ok, e quello che voglio è creare il subSet non con il fornire da "b" a "d", ma con qualche comparatore che sottoset seleziona per me ogni secondo. Presumo che selezionare non continuo sia difficile, quindi non esiste un contenitore generico. Ma se TreeSet ha un comparatore che divide elementi su i.e dispari e pari. Voglio subSet prima parte o secondo con l'uso di tale comparatore. – userbb
@userbb OK, non penso che il comparatore di TreeSet possa fare quello che vuoi. Il comparatore stabilisce un * ordine totale * di tutti gli elementi dell'insieme ed è una proprietà fissa dell'insieme, stabilita al momento della creazione. Ad esempio, non è possibile impostarlo all'interno di un'operazione di query. Sembra che tu abbia bisogno di qualcosa di più simile a un filtro con un predicato, ma penso che tu debba spiegare più dettagliatamente il tuo caso d'uso. Io e altri stiamo facendo un bel po 'di ipotesi. –
Si intende aggiungere una sorta di "trigger" alla raccolta, che filtra gli elementi aggiunti all'elenco? –
Non penso che sia possibile farlo per una raccolta regolare, poiché la classe dovrebbe implementare una sorta di interfaccia osservabile. O quello, o devi testare ogni elemento ogni volta nel caso in cui qualcosa sia cambiato nella collezione originale. –
'NavigableSet.subSet()' fa quello che vuoi? –