2016-07-06 3 views
0

Мне нужна структура данных, например HashSet.Структура данных для подсчета частоты равных позиций

  1. Не следует добавлять один и тот же элемент в коллекции
  2. Но вместо того, чтобы добавлять один и тот же предмет, он должен рассчитывать раз был добавлен этот пункт.

Как я понимаю HashSet вычисляет hashCode на первый, если hashCode тот же проверяет equals метод, если верно, чем это не добавит элемент, в противном случае элемент с таким же hashCode но другой equals будет добавлен к ковшу связанного список.

Мне нужно только сохранить только уникальные объекты, такие как Set, но используя только метод equals, и если объекты равны, чем счетчик приращений, связанный с каждым объектом.

Есть ли такая структура данных уже реализована, или я должен создать свою собственную?

+2

Вы действительно не хотите использовать * just * equals, если вы действительно не хотите проверять все, что вы уже видели на каждой итерации. Похоже, вы просто хотите использовать для меня «HashMap ». –

+0

Меня не интересует hashCode, мне только вопрос о равном методе, потому что мне нужно подсчитать, сколько из того же объекта (семантически равного с использованием метода equals) были добавлены в 'Set'. – bkdaaqra

+2

Или, если вы можете использовать Guava, ['Multiset'] (https://github.com/google/guava/wiki/NewCollectionTypesExplained). –

ответ

4

Кажется, что вам действительно нужна карта. Для каждого элемента вы можете иметь количество элементов

public class ItemCounter<T>{ 

    private Map<T, Integer> counts = new HashMap<T, Integer>(); 

    public void addItem(T item){ 
     Integer numberOfOcurrences = counts.get(item);    
     numberOfOcurrences = numberOfOcurrences == null ? 0 : numberOfOcurrences+1; 
     counts.put(item, numberOfOcurrences);    
    } 

    public Integer getCount(T item){ 
     Integer numberOfOcurrences = counts.get(item);  
     return numberOfOcurrences == null ? 0 : numberOfOcurrences; 
    } 
} 
2

Самый простой способ (без dependecies) должен иметь HashMap<Element, Integer>. Или вы можете использовать Guava's MultiSet, который имеет метод count(Object), чтобы получить количество вхождений объекта в коллекции.

+1

«Поэтому он всегда проверяет использование равных» - только тогда, когда он найден, кандидаты, чьи хэш-коды совпадают. Если у вас есть набор, у которого уже есть 10 элементов (хеш-коды 1 ... 10), и вы пытаетесь добавить новый элемент с хэш-кодом 100, он не будет называть 'equals' вообще. –

+0

@JonSkeet Спасибо за исправление. – manouti

Смежные вопросы