Если вы не хотите каждый раз перебирать всю коллекцию, другой альтернативой будет написать реализацию ForwardingList . Основные преимущества по сравнению с предложением HashBag:
- поддерживает дженерики
- он реализует интерфейс List, поэтому вы можете передать его любому методу, который ожидает List
Однако у этого подхода есть и обратная сторона: для его запуска вам нужно написать немного кода для подключения.
Ниже приведен краткий пример того, как вы могли это сделать. Обратите внимание, что если вы сделаете это, вы должны переопределить все методы, которые добавляют / удаляют из списка, иначе вы можете оказаться в несогласованном состоянии:
import com.google.common.collect.ForwardingList;
public class CountingList<E> extends ForwardingList<E> {
private List<E> backingList = new LinkedList<E>();
private Map<E, Integer> countMap = new HashMap<E, Integer>();
@Override
protected List<E> delegate() {
return backingList;
}
@Override
public boolean add(E element) {
backingList.add(element);
if(countMap.containsKey(element)) {
countMap.put(element, countMap.get(element) + 1);
} else {
countMap.put(element, 1);
}
return true;
}
public int getCount(E element) {
Integer count = countMap.get(element);
return count != null ? count.intValue() : 0;
}
}