Добавить (удалить) элемент (ы) из 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)));

Вы должны будете обернуть это в метод, чтобы сделать его более легким в использовании.

Однако я настоятельно советую вам использовать изменяемые коллекции вместо неизменяемых, если вам действительно нужно изменить их.

Другие вопросы по тегам