witam,
jak moge posortowac ConcurrentHashMap wg. wartosci?
witam,
jak moge posortowac ConcurrentHashMap wg. wartosci?
Korzystając z comparatorów możesz nawet posortować ludzi według ich obwodu w pasie ;]
Zobacz też inną wersję tej funkcji znajdującą się nad podlinkowaną.
Co masz na myśli? Jeśli chcesz dostać posortowaną płytką kopię owej mapy to wystarczy:
SortedMap sortedMap = new TreeMap(concurrentHashMapInstance);
Natomiast jeśli szukasz mapy, która utrzymuje porządek i jest thread-safe to użyj ConcurrentSkipListMap.
Edit:
Wg wartości? A nie przypadkiem kluczy? Jeśli po wartościach to:
A co jest pierwszym, drugim,..., ostatnim elementem w nieposortowanej Hashmapie?
dzieki za odpowiedzi,
jest to tablica userow z najlepszymi wynikami, tzn ID usera i jego wynik.
po zakonczeniu glosowania, chce posortowac malejaco, i wybrac 3 najlepsze wyniki.
ogolnie polecicie jakas ksiazke do java? ale TYLKO i wylacznie podstawy.
bo na codzien pisze w innym jezyku, ale czasami musze cos napisac po stronie serwera a tam jest tylko java.
A widzisz. Trzeba było wcześniej opisać problem. Na twoim miejscu stworzyłbym trójelementową listę par (mogą to być Map.Entry, nie trzeba robić wtedy nowej klasy dla pary), a potem iterował po wejściowej HashMapie. Przez cały czas iteracji trzymałbym osobno jeszcze index, nazwijmy go minPodium, do minimalnego wyniku z tej listy. Podczas iteracji, jeżeli sprawdzam dany element, nazwijmy go x, robię:
// sprawdź czy aktualny element jest mniejszy od najmniejszego na podium
if (lista.get(minPodium).wynik() < x.wynik()) {
// zastąp minimum obecnym elementem
lista.set(minPodium, x);
// poszukaj na nowo minimum
minPodium = 0;
for (int i = 1; i < list.length(); i++)
if (lista.get(i).wynik() < lista.get(minPodium).wynik())
minPodium = i;
}
Na końcu (po przeiterowaniu) dopiero robisz Collections.sort() na tej trzyelementowej liście.
Kod niesprawdzony, może zawierać błędy.
dzieki, zrobilem cos takiego:
public ArrayList<Integer> getFinalResults() {
// posortowana lista, bedzie zawierala ID usera
ArrayList<Integer> results = new ArrayList<Integer>();
// przeszukuje tablice zawieraja ID usera i jego wynik
for (Entry<Integer, Integer> o : candidates.entrySet()) {
int residentID = o.getKey(); // ID usera
int votes = o.getValue(); // wynik
// pierwszy wynik jest zawsze dodawany
if (results.size() == 0){ results.add(residentID);}
else {
// czy zajal wyzsza pozycje niz user bedacy na posortowanej liscie
boolean wasShift = false;
for (int i = 0; i < results.size(); i++){
if (votes > candidates.get(results.get(i))){
wasShift = true;
results.add(i, residentID);
break;
}
}
// ostatnie miejsce
if (!wasShift){
results.add(residentID);
}
}
}
return results;
}