Почему TreeSet может содержать только один объект, когда я нажимаю три в нем? - PullRequest
0 голосов
/ 20 февраля 2012

Я хочу поместить некоторые объекты в TreeSet (внутри класса BigHeap), но у меня возникла проблема:

вот мой основной класс:

# --------- Print 3 -----------
Logger.info("items.size() = " + items.size()); 
for (Item item : items) {
  Long score = item.getScoreByQueryItems(queryItems);
  Long itemId = item.id;
  ItemCacheNode node = new ItemCacheNode(itemId,score);
  bigHeap.push(node);  <----- here is the push action ---------
  # --------------Print three times------------
  Logger.info("node.itemId = " + node.getItemId()); 
}
# ---------------Print 1----------
Logger.info("bigHeap.getTreeSet().size() = " + bigHeap.getTreeSet().size()); 

А вот мой BigHeap.java:

public class BigHeap<T> {
 private TreeSet<T> treeSet;
 public BigHeap(Comparator<T> comparator){
   this.treeSet = new TreeSet<T>(comparator);
 }
 public void push(T o){
   treeSet.add(o);
 }
 public TreeSet<T> getTreeSet(){
   return this.treeSet;
 }
}

Проблема в том, почему bigHeap нажимает три раза (разные объекты), но в конце концов удерживает только один объект.

1 Ответ

0 голосов
/ 22 марта 2016

Это может быть связано с тем, что Set не допускает дублирование элементов.

Вы помещаете объекты типа ItemCacheNode в set ADT с именем bigHeap. Теперь, когда новый объект добавляется в набор, согласно документам ,

Элементы упорядочены, используя их естественное упорядочение или Компаратор предоставляется во время создания набора, в зависимости от того, какой используется конструктор.

Ошибочный компаратор переопределяет все остальные звуки, равнозначные методу, присущему TreeSet , если Treeset неправильно реализован с использованием интерфейса Set. В соответствии с вышеупомянутыми документами,

Обратите внимание, что порядок поддерживается набором (независимо от того, явно компаратор предоставляется) должен соответствовать равным, если это правильно реализовать интерфейс Set. (См. Сравнительный или компаратор для точного определения в соответствии с равными.) Это так потому что интерфейс Set определен в терминах операции equals, но экземпляр TreeSet выполняет все сравнения элементов, используя его Сравнивать (или сравнивать) метод, поэтому два элемента считаются равными этим методом с точки зрения множества равны. поведение набора четко определено, даже если его порядок не соответствует с равными; он просто не соблюдает общий договор интерфейс.

Ваше определение,

private TreeSet<T> treeSet = new TreeSet<T>(comparator);

игнорирует использование интерфейса и, как следствие, продемонстрировал эту ошибочную функциональность, не соблюдая общее представление о функциональности не дублирования Set.

...