Guava – Multiset接口

Guava – Multiset接口

Multiset接口简介: Multiset是一个支持顺序无关的平等的集合,像Set一样,但可能有重复的元素。我们可能认为多集就是一个列表,但事实并非如此。

  • Lists可以容纳同一对象的重复,而且Lists总是有序的。
  • 集合不能容纳重复的元素,而且集合接口也不能保证其顺序。

所以,多数据集是介于列表和集合之间的一种灰色区域。允许重复,但不保证顺序。 Multiset有时也被称为包。在多集中,和集合一样,与图元相比,元素的顺序在多集中是不相关的。例如:多集{a,a,b}{a,b,a}是相等的。

有两种主要的方式来看待多集:

  • 这就像一个没有排序约束的 ArrayList < E > ,即排序并不重要。
  • 这就像一个 Map <E, Integer>,有元素和计数。

Multiset接口要点:

  • Multiset是一个集合,它支持与顺序无关的平等,就像Set一样,但可能有重复的元素。
  • Multiset中彼此相等的元素被称为同一单一元素的出现。
  • 一个多集合中一个元素出现的总数被称为该元素的 count
  • 因为一个元素的计数是用int表示的,所以一个多数据集永远不会包含超过Integer.MAX_VALUE的任何一个元素的出现次数。
  • Multiset使用Object.equals(java.lang.Object)来确定两个实例是否应被视为 “相同”,除非实现中另有规定。
  • Multiset < E > ,只有具有正数的元素。任何元素都不能有负数,计数为0的值被认为不在多数据集中。它们不会出现在 elementSet() 或 entrySet() 视图中。
  • multiset.size()返回集合的大小,它等于所有元素的计数之和。对于独立元素的数量,使用 elementSet().size()。例如,add(E)使multiset.size()增加1。
  • multiset.iterator()对每个元素的每个出现进行迭代,所以迭代的长度等于multiset.size()。
  • Multiset支持添加元素、删除元素或直接设置元素的计数。setCount(element, 0)等同于删除该元素的所有出现次数。
  • multiset.count(element)对于不在multiset中的元素总是返回0。

Multiset接口声明: com.google.common.collect.Multiset接口的声明如下。

@GwtCompatible
public interface Multiset
   extends Collection

Guava - Multiset接口

Example : 我们知道,如果两个相等的元素被添加到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<String> 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<String> 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接口所提供的一些其他方法。

Guava - Multiset接口

实现 : Guava提供了许多Multiset的实现,这些实现与JDK map的实现大体一致。
Guava - Multiset接口

Set的例子 :

// 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<String> 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

Multiset的例子 :

// 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<String> 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

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程