从不可变的排序多重集中添加(删除)元素
Add(remove) element(s) from an ImmutableSortedMultiset
我正在努力如何使用 Guava ImmutableSortedMultiset 执行基本操作...
- 如何创建包含新元素的现有 ImmutableSortedMultiset 的副本?
- 如何创建已删除其中一个元素的现有 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);
我正在努力如何使用 Guava ImmutableSortedMultiset 执行基本操作...
- 如何创建包含新元素的现有 ImmutableSortedMultiset 的副本?
- 如何创建已删除其中一个元素的现有 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);