多组接口 |番石榴 |Java
简介: Multiset 是一个支持顺序无关相等的集合,和 Set 一样,但可能有重复的元素。我们可能会认为 Multiset 是一个 List,但事实并非如此。
- 列表可以保存同一对象的重复项,并且列表始终是有序的。
- Set 不能包含重复项,并且 Set 接口无法保证顺序。
因此,Multiset 占据了 List 和 Set 之间的一种灰色区域。允许重复,但不保证顺序。多重集有时也称为包。在多重集中,就像在集合中一样,并且与元组相反,元素的顺序在多重集中是无关紧要的。例如:多重集 {a, a, b} 和 {a, b, a} 相等。
查看 Multiset 有两种主要方法:
- 这就像一个没有排序约束的ArrayList< E > ,即排序无关紧要。
- 这就像一个带有元素和计数的Map< E, Integer > 。
要点:
- Multiset 是一个支持顺序无关相等的集合,和 Set 一样,但可能有重复的元素。
- 多重集合中彼此相等的元素被称为相同单个元素的出现。
- 一个元素在多重集中出现的总次数称为该元素的计数。
- 由于元素的计数表示为 int,因此多重集可能永远不会包含超过Integer.MAX_VALUE出现的任何一个元素。
- 多重集使用 Object.equals(Java.lang.Object) 来确定两个实例是否应该被认为是“相同的”,除非实现中另有规定。
- Multiset< E >仅包含具有正计数的元素。任何元素都不能有负计数,计数为 0 的值被认为不在多重集中。它们不会出现在 elementSet() 或 entrySet() 视图中。
- multiset.size() 返回集合的大小,等于所有元素的计数之和。对于不同元素的数量,使用 elementSet().size()。例如, add(E) 将 multiset.size() 增加一。
- multiset.iterator() 迭代每个元素的每次出现,因此迭代的长度等于 multiset.size()。
- Multiset 支持添加元素、删除元素或直接设置元素的数量。 setCount(element, 0) 相当于删除所有出现的元素。
- 对于不在多重集中的元素的 multiset.count(element) 始终返回 0。
声明: com.google.common.collect.Multiset 接口的声明如下:
@GwtCompatible
public interface Multiset
extends Collection
示例:我们知道如果将两个相等的元素添加到Java.util.Set,那么第二个元素将被丢弃。
// Java implementation to show if 2
// equal elements are added to
// java.util.Set, then the 2nd element
// will be discarded
import java.util.Set;
import java.util.HashSet;
// Set of Strings
Set set = new HashSet();
// Adding elements to the set
set.add("Geeks");
set.add("Geeks");
System.out.println(set);
// The output will be [Geeks]
但是,如果我们使用 Guava 的 Multiset,则不会丢弃重复的元素。请参阅下面的代码以实现:
// Java implementation to show if 2
// equal elements are added to
// Multiset, then the 2nd element
// will not be discarded
import com.google.common.collect.HashMultiset;
import com.google.common.collect.Multiset;
// Multiset of String
Multiset multiset = HashMultiset.create();
// Adding elements to the set
multiset.add("Geeks");
multiset.add("Geeks");
System.out.println(multiset);
// The output will be [Geeks X 2]
下面给出了 Guava 的 Multiset Interface 提供的一些其他方法:
实施:
Guava 提供了很多 Multiset 的实现,大致对应 JDK 的 map 实现。
设置示例:
// Java code to show implementation
// of a Set
import java.util.*;
import com.google.common.collect.HashMultiset;
import com.google.common.collect.Multiset;
class GuavaTester {
// Driver code
public static void main(String args[])
{
// Creating a Set of Strings
Set set = new HashSet();
// Adding elements to set
set.add("Geeks");
set.add("for");
set.add("Geeks");
set.add("for");
set.add("GeeksforGeeks");
set.add("Geeks");
set.add("GeeksforGeeks");
set.add("Geeks");
// printing the total size of the set
System.out.println("Total Size is : " + set.size());
// print the occurrence of each element
System.out.println("Occurrences of Geeks are : " + Collections.frequency(set, "Geeks"));
System.out.println("Occurrences of for are : " + Collections.frequency(set, "for"));
System.out.println("Occurrences of GeeksforGeeks are : " + Collections.frequency(set, "GeeksforGeeks"));
}
}
输出 :
Total Size is : 3
Occurrences of Geeks are : 1
Occurrences of for are : 1
Occurrences of GeeksforGeeks are : 1
多组示例:
// Java code to show implementation
// of a Multiset
import java.util.*;
import com.google.common.collect.HashMultiset;
import com.google.common.collect.Multiset;
class GuavaTester {
// Driver code
public static void main(String args[])
{
// Creating a Multiset of Strings
Multiset multiset = HashMultiset.create();
// Adding elements to multiset
multiset.add("Geeks");
multiset.add("for");
multiset.add("Geeks");
multiset.add("for");
multiset.add("GeeksforGeeks");
multiset.add("Geeks");
multiset.add("GeeksforGeeks");
multiset.add("Geeks");
// printing the total size of the multiset
System.out.println("Total Size is : " + multiset.size());
// print the occurrence of each element
System.out.println("Occurrences of Geeks are : " + multiset.count("Geeks"));
System.out.println("Occurrences of for are : " + multiset.count("for"));
System.out.println("Occurrences of GeeksforGeeks are : " + multiset.count("GeeksforGeeks"));
}
}
输出 :
Total Size is : 8
Occurrences of Geeks are : 4
Occurrences of for are : 2
Occurrences of GeeksforGeeks are : 2
参考:谷歌番石榴