2013-05-14 4 views
-1

Мне нужен TreeMap<Object, HGHandle>, но мои объекты не сравнимы и не имеют общего Comparator<Object>.универсальный компаратор для TreeMap <Object, T>?

Порядок в дереве, относящийся только к самому дереву, есть ЛЮБОЙ общий компаратор, который я мог бы использовать для дерева?

Info: Я хочу добавить тривиальный механизм кеширования некоторой библиотеки, подобной базе данных, специализированной для массового импорта. Поскольку это очень трудоемкая задача, я предпочитаю использовать карту на основе дерева над HashMap, поэтому BulkImportCache становится более экономичным и может увеличиваться и сокращаться по мере необходимости.

+0

Значит, вы предпочитаете время «O (nlgn)», а не время «O (1)»? Это похоже на выбор _bad_ для массового импорта ... –

+0

@ Борис Паук: Я все еще расследую. Речь идет не только о скорости, но и о памяти. Также я считаю, что O (lgn) не O (n ln n). Кроме того, имейте в виду, что HashMaps не имеет O (1), когда он должен постоянно расти. Вы можете сказать, хорошо, просто введите достаточно большой размер начала. Но если он вырастет выше этого, базовый HashTable будет использовать гораздо больше места. – ib84

ответ

-1

EDIT: Код обновлен.

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

import org.apache.commons.lang3.builder.HashCodeBuilder; 

class HashCodeComparator implements Comparator<Object>{ 
    @Override 
    public int compare(Object o1, Object o2) { 
     final int dif = o1.hashCode() - o2.hashCode(); 
     if (dif == 0) 
       if(o1.equals(o2)) 
        return 0; 
       else 
        return HashCodeBuilder.reflectionHashCode(o1) - HashCodeBuilder.reflectionHashCode(o2); 
     else 
      return dif; 
    } 
+0

Это ** не работает **. Объекты, которые ** не ** равны, могут (и будут) иметь один и тот же хэш-код. В итоге вы получите кеш (по-видимому) случайным образом возвращает неправильное значение. –

+0

Это не сработает, потому что два неравных объекта могут иметь одинаковые хэш-коды. –

+0

@JohnB обновлен. Может ли это работать? – ib84

2

Для того, чтобы иметь возможность использовать TreeMap вы должны иметь возможность сравнивать экземпляры, которые вы собираетесь хранить в Map. Возможно, у вас есть компаратор, который знает различные типы объектов, которые могут быть сохранены на карте, и делегирует для сравнения типов по типу. Но каким бы способом вы его не нарезали, вы ДОЛЖНЫ предоставить механизм сравнения, а один не существует для объектов не Comparable.

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