📜  多组接口 |番石榴 |Java

📅  最后修改于: 2022-05-13 01:55:32.535000             🧑  作者: Mango

多组接口 |番石榴 |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

参考:谷歌番石榴