Добавить (удалить) элемент (ы) из ImmutableSortedMultiset
Я изо всех сил, как выполнять основные операции, используя Guava ImmutableSortedMultiset...
- Как создать копию существующего ImmutableSortedMultiset, содержащего новый элемент?
- Как создать копию существующего ImmutableSortedMultiset, в котором один из элементов был удален?
Если возможно, я хотел бы иметь возможность выполнять эти операции без сортировки существующей коллекции каждый раз, когда новый элемент добавляется (удаляется).
2 ответа
Я не думаю, что вы можете сделать это без перестройки нового ImmutableSortedMultiset. Если у вас есть original
MultiSet, я бы начал с составного представления с использованием методов в Multiset
:
// View with one more element
Multiset<String> view = Multisets.union(original, ImmutableMultiset.of("a"));
или же
// View with one less element
Multiset<String> view = Multisets.difference(original, ImmutableMultiset.of("a"));
с последующим созданием неизменяемой отсортированной копии:
ImmutableSortedMultiset<String> copy = ImmutableSortedMultiset.copyOf(view);
На самом деле это сложный вопрос, потому что, насколько я знаю, Гуава не предоставляет какого-либо простого способа достичь вашей цели. Возможно, вам не следует иметь дело с неизменными коллекциями, если вам нужно их изменить. Например, вы можете хранить ваши данные в изменяемом SortedMultiset и делать защитную копию, когда вам нужно передать их куда-нибудь
Однако эти операции все еще возможны.
Добавить и скопировать
Чтобы добавить элемент в неизменяемую коллекцию, вам нужно использовать builder
ImmutableSortedMultiset<T> original = ...; //your original data which you want to modify
T element = ...; //new element which you want to add
ImmutableSortedMultiset<T> result = ImmutableSortedMultiset.<T>naturalOrder()
.addAll(original) //copying original data
.add(element)
.build();
Удалить и скопировать
Здесь все становится немного сложнее, потому что вам нужно будет отфильтровать оригинальную коллекцию и исключить элемент, который вы хотите удалить
ImmutableSortedMultiset<T> original = ...;
T el = ...; //element which you want to remove
ImmutableSortedMultiset<T> result = ImmutableSortedMultiset.copyOf( //copy...
Collections2.filter(original, //and filter
Predicates.not(Predicates.equalTo(el)));
Вы должны будете обернуть это в метод, чтобы сделать его более легким в использовании.
Однако я настоятельно советую вам использовать изменяемые коллекции вместо неизменяемых, если вам действительно нужно изменить их.