从不可变的排序多重集中添加(删除)元素

Add(remove) element(s) from an ImmutableSortedMultiset

我正在努力如何使用 Guava ImmutableSortedMultiset 执行基本操作...

如果可能,我希望能够执行这些操作而无需每次添加(删除)新元素时对现有集合进行排序。

这实际上是一个棘手的问题,因为据我所知,Guava 没有提供任何简单的方法来实现您的目标。如果您需要更改它们,也许您不应该处理不可变集合。例如,您可以将数据存储在可变的 SortedMultiset 中,并在需要将其传递到某个地方时制作防御副本

不过,这些操作还是可以的。

添加复制

为了在不可变集合中添加元素,您需要使用构建器

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

您必须将其包装到一个方法中以使其更易于使用。

但是,如果您确实需要修改它们,我强烈建议您使用可变集合而不是不可变集合。

我认为如果不重新构建一个新的 ImmutableSortedMultiset 是做不到的。假设你有一个 original 多重集,我会首先使用 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);