sortowanie ConcurrentHashMap<Integer, Integer>

0

witam,

jak moge posortowac ConcurrentHashMap wg. wartosci?

0

http://docs.oracle.com/javase/1.4.2/docs/api/java/util/Collections.html#sort%28java.util.List,%20java.util.Comparator%29

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ą.

1

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:

  1. Wyciągnij entrySet();
  2. Stwórz ArrayListę instancji Map.Entry z zamienionymi generykami,
  3. Przepakuj elementy entrySeta do ArrayList podmieniając klucz z wartością.
  4. Wywołaj Collections.sort() na otrzymanej ArrayLiście.
0

A co jest pierwszym, drugim,..., ostatnim elementem w nieposortowanej Hashmapie?

0

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.

0

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.

0

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;
	}

1 użytkowników online, w tym zalogowanych: 0, gości: 1