Статьи

Google Guava Multisets

Продолжая этот тур по Гуаве, мы попадаем в Мультисеть . Я, вероятно, использую это не так часто, как Multimaps или Bimaps, но он, безусловно, имеет свое применение.

Так что же такое мультисеть?

Как вы можете догадаться, это набор, который может содержать несколько экземпляров одного и того же объекта.

Разве это не просто список?

В Java есть два основных различия между списками и наборами. Списки могут содержать дубликаты одного и того же объекта, а списки всегда упорядочены. Наборы не могут содержать дубликаты, и нет никакой гарантии порядка через интерфейс Set. (Некоторые реализации — LinkedHashSet, SortedSet и т. Д. — конечно, обеспечивают гарантированный заказ!)

Таким образом, мультисеть занимает своего рода серую область между списком и множеством. Дубликаты разрешены, но заказ не гарантирован.

Эту коллекцию также иногда называют Bag , фактически, это то, что Apache Commons Collections называет это Mutlisets.

Так что бы я использовал один для?

Самое замечательное в мультисетах — они отслеживают количество каждого конкретного объекта в наборе. Таким образом, вы можете использовать их для подсчета вещей. Вы когда-нибудь писали код, подобный следующему:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
Map<MyClass,Integer> objectCounts = new HashMap<MyClass,Integer>();
 
public void incrementCount(MyClass obj) {
    Integer count = objectCounts.get(obj);
    if (count == null) {
        objectCounts.put(obj,0);
    } else {
        objectCounts.put(obj,count++);
    }
}
 
public int getCount(MyClass obj) {
    Integer count = objectCounts.get(obj);
    if (count == null) {
        return 0;
    } else {
        return count;
    }
}

Немного громоздко? Давайте посмотрим, как мы могли бы использовать вместо этого Multiset:

01
02
03
04
05
06
07
08
09
10
11
Multiset<MyClass> myMultiset = HashMultiset.create();
 
MyClass myObject = new MyClass();
 
myMultiset.add(myObject);
myMultiset.add(myObject);  // add it a second time.
 
System.out.println(myMultiset.count(myObject)); // 2
 
myMultiset.remove(myObject);
System.out.println(myMultiset.count(myObject)); // 1

Как видите, все гораздо проще! Можно даже добавить / удалить более одного объекта одновременно

01
02
03
04
05
06
07
08
09
10
Multiset<MyClass> myMultiset = HashMultiset.create();
 
MyClass myObject = new MyClass();
myMultiset.add(myObject,5); // Add 5 copies of myObject
 
System.out.println(myMultiset.count(myObject)); // 5
 
myMultiset.remove(myObject,2); // remove 2 copies
 
System.out.println(myMultiset.count(myObject)); // 3

Довольно полезно, а? Как обычно, есть несколько реализаций, доступных в зависимости от ваших требований, и я рекомендую взглянуть на API: http://docs.guava-libraries.googlecode.com/git-history/v9.0/javadoc/com/google/common /collect/Multiset.html

Ссылка: Google Guava Multisets от нашего партнера JCG Тома Джеффериса в блоге Tom’s Programming Blog .