HashSet s custom hasher
2 отговора
144 прегледа
HashSet s custom hasher
значи имам нужда от нещо подобно на ТрийСет със зададен Сравнител, но за сетове с О(1) сложност. С други думи налага ми се да слагам в сет елементи на които естествените хашкод и equals методи не може да се ползват.
Най-естествения начин от гледна точки АПИ е да има нещо като ХашСет което приема външен обект-хашер и използва неговите методи вместо натуралните на обектите. В момента това съм си го направил с опаковане на всички обекти които се слагат в сета - лесно се пише, но много нови обекти се създават при големи сетове.
Разглеждайки кода на ХашСет, забелязвам че ако можех да променя поведението на HashMap.hash(Object) да делегейтва към моят Хашер обект, щях да си спестя създаването на всички опаковъчни обекти. Хубаво, обаче метода е статичен, а лиценза на Сън не позволява да си изкопирам класа в моето приложение (което на всичкото отгоре е ГПЛ). Та въпроса ми е има ли имплементации на ХашСет които да са взаимозаменями с тези на Сън но са с по-човешки лиценз? Ако пък има нещо което директно приема външни Хашери ще е супер.
Мерси предварително
Най-естествения начин от гледна точки АПИ е да има нещо като ХашСет което приема външен обект-хашер и използва неговите методи вместо натуралните на обектите. В момента това съм си го направил с опаковане на всички обекти които се слагат в сета - лесно се пише, но много нови обекти се създават при големи сетове.
Разглеждайки кода на ХашСет, забелязвам че ако можех да променя поведението на HashMap.hash(Object) да делегейтва към моят Хашер обект, щях да си спестя създаването на всички опаковъчни обекти. Хубаво, обаче метода е статичен, а лиценза на Сън не позволява да си изкопирам класа в моето приложение (което на всичкото отгоре е ГПЛ). Та въпроса ми е има ли имплементации на ХашСет които да са взаимозаменями с тези на Сън но са с по-човешки лиценз? Ако пък има нещо което директно приема външни Хашери ще е супер.
Мерси предварително
Re: HashSet s custom hasher
HashMap можеш да вземеш от GNU Classpath:
[линк]
Друг начин е да смениш HashMap.hash метода когато го зарежда ClassLoader-a с твой собствен като ползваш [линк]
Нещо такова:
class NewMap implements Map {
Map myMap;
NewMap() throws Exception {
// Генерираш клас my.java.util.HashMap от bytecode-a на java.util.HashMap
// в директория C:/Temp/classpath/my/java/util
// като променяш HashMap.hash да вика
// твой статичен метод от твой клас където можеш да правиш всичко
// Забележи че пакета е различен (my.java.util) иначе системния ClassLoader
// ще зареди нормалния клас
URL url = new URL("file:/C:/Temp/classpath");
ClassLoader loader = new URLClassLoader(new URL[] {url}, null);
Class mapClass = loader.loadClass("my.java.util.HashMap");
myMap = (Map) mapClass.newInstance();
}
public int size() {
return myMap.size();
}
....
Останалите методи трансферират към myMap като size()
....
}
Map map = new NewMap();
ASM генериращия код не е никак сложен. Ако разбереш примерите от библиотеката ще го напишеш бързо.
Третият начин (който е и най-добър) е да си оставиш кода си както е сега, освен ако програмата ти в момента не може да работи заради малко памет и единствения начин да се намали ползването е като се махнат тези малки обекти.
[линк]
Друг начин е да смениш HashMap.hash метода когато го зарежда ClassLoader-a с твой собствен като ползваш [линк]
Нещо такова:
class NewMap implements Map {
Map myMap;
NewMap() throws Exception {
// Генерираш клас my.java.util.HashMap от bytecode-a на java.util.HashMap
// в директория C:/Temp/classpath/my/java/util
// като променяш HashMap.hash да вика
// твой статичен метод от твой клас където можеш да правиш всичко
// Забележи че пакета е различен (my.java.util) иначе системния ClassLoader
// ще зареди нормалния клас
URL url = new URL("file:/C:/Temp/classpath");
ClassLoader loader = new URLClassLoader(new URL[] {url}, null);
Class mapClass = loader.loadClass("my.java.util.HashMap");
myMap = (Map) mapClass.newInstance();
}
public int size() {
return myMap.size();
}
....
Останалите методи трансферират към myMap като size()
....
}
Map map = new NewMap();
ASM генериращия код не е никак сложен. Ако разбереш примерите от библиотеката ще го напишеш бързо.
Третият начин (който е и най-добър) е да си оставиш кода си както е сега, освен ако програмата ти в момента не може да работи заради малко памет и единствения начин да се намали ползването е като се махнат тези малки обекти.
Re: HashSet s custom hasher
виж дали това ще ти свърши работа...
[линк]
El rito constituye el Secreto
[линк]
El rito constituye el Secreto