2013-03-03 2 views
5

Есть ли реализация класса HashMap (или интерфейса карты), который позволит мне использовать альтернативные операции hashcode и equals ... Аналогично тому, как можно сортировать коллекции одного и того же типа несколькими способами, используя Comparator in Collections.sort (список, компаратор).Пользовательский hashcode/equals для HashMap

Я хотел бы избежать, если возможно, создания оболочки ключа, обеспечивающей желаемый хэш-код и равный операции.


В моем случае, один из сценариев, почему мне нужно что-то вроде этого:

В моем веб-приложение, для каждого запроса, я загружаю Расположение/ISP и другие данные. В разных частях кода (в слоях службы и репозитория) у меня есть «сведенные к минимуму» кеши, специфичные для его требований.

Вот упрощенный пример кода:

class GeoIpData{ 
    private String countryName; 
    private String state; 
    private String city; 
    private String isp; 
    @Override 
    public int hashCode() { 
     //countryName hashCode 
     //state hashCode 
     //city hashCode 
     //isp hashCode 
    } 
    @Override 
    public boolean equals(Object obj) { 
     // compare countryName 
     // compare state 
     // compare city 
     // compare isp 
    } 
} 

Map<GeoIpData,#Type1> fullCache = ... //This cache needs to be unique per countryName,state,city and isp 
Map<GeoIpData,#Type2> countryCache = ... //This cache needs to be unique per countryName 
Map<GeoIpData,#Type2> ispCache = ... //This cache needs to be unique per countryName,isp 

Для достижения этой цели вышеуказанные 3 карты необходимо 3 различных хэш-код и равняется методов.

fullCache: 
hashCode -> GeoIpData.hashCode(); 
equals -> GeoIpData.equals(Object obj); 

countryCache: 
hashCode -> {countryName hashCode } 
equals -> {compare countryName } 

ispCache: 
hashCode -> {countryName hashCode & isp hashCode } 
equals -> {compare countryName & compare isp hashCode } 

ответ

7

GNU Trove позволяет обеспечить определенную TObjectHashingStrategy с вашим собственным хэш и равна функции для TCustomHashMap.

+0

Привет «Noofz» Спасибо за совет, позвольте мне сначала выполнить некоторые тесты ... Вы использовали это раньше, если у вас есть, как он работает в многопоточных средах? Операция cache.get (...) выполняется от 5000 до 30000 раз в секунду и может увеличиться вдвое. – NeilA

+0

Нет, к счастью, у меня нет опыта использования его при таком большом преодолении. – Mikhail

+0

Прошел несколько тестов. Труд кажется немного медленнее ... – NeilA