Sortowanie Map

0

Witam,
mam tutaj taki mały program (wyświetla słowa i ich ilość w zdaniu):

import java.io.*;
import java.text.*;
import java.util.*;
import java.util.Map.Entry;



public class Program{

	public static void main(String[] args) {
		
		try {
		
			
			Map<String, Integer> mapa = new HashMap<String, Integer>();
			
			FileReader plik = new FileReader("C:\\Temp\\tekst.txt");
			BufferedReader reader = new BufferedReader(plik);
			
			String s = null;
			int numberOfWord = 0;
			
			while((s = reader.readLine()) != null) {
				StringTokenizer st = new StringTokenizer(s," ! @ # $ % ^ & * * ( ) , . < > / ? \" : ; { } [ ] | = + - ");
				int n = st.countTokens();
				
				for(int i = 0 ; i < n ; i ++) {
					String word = st.nextToken();
					if(mapa.containsKey(word)) {
						numberOfWord = mapa.get(word);
						numberOfWord++;
						mapa.put(word, numberOfWord);
					} else {
						mapa.put(word, 1);
					}
					
				}
			}
			
	        Collator col= Collator.getInstance(new Locale("pl"));
	        
			Set<String> s1 = mapa.keySet();
			Iterator it = s1.iterator();
			Collection<Integer> s2 = mapa.values();
			Iterator it2 = s2.iterator();
			while(it.hasNext() && it2.hasNext()) {
				System.out.println(it.next() + " " + it2.next());
			}
			
			reader.close();
			
		} catch(IOException exc) {
			exc.printStackTrace();
		}
		
	}

}

I teraz chciałbym wynik posortować w kolejności alfabetycznej z pomocą Collatora.
Za każdą pomoc będę bardzo wdzięczny.

Pozdrawiam

0
  1. Użyj map.entrySet(), aby otrzymać kolekcję par i stwórz na jej podstawie ArrayList.
  2. Posortuj za pomocą Collections.sort. Musisz napiać odpowiedni Comparator.
final Collator col = Collator.getInstance(new Locale("pl"));

List<Map.Entry<String, Integer>> list = new ArrayList<Map.Entry<String, Integer>>(mapa.entrySet());

Collections.sort(list, new Comparator<Map.Entry<String, Integer>>() {
	@Override
	public int compare(Entry<String, Integer> o1, Entry<String, Integer> o2) {
		return col.compare(o1.getKey(), o2.getKey());
	}
});

for(Map.Entry<String, Integer> entry: list){
	System.out.println(entry.getKey() + " "+ entry.getValue());
}
0

J.w., z tym, ze Collator juz sam implementuje interfejs Comparator, wiec jesli nie potrzebujesz porownywac calych Map.Entry, nie trzeba przeciazac metod. Wystarczy tez posortowac wylacznie klucze mapy, np. Arrays.sort(T[], Comparator<? super T>) (po wyciagnieciu ich zbioru i przetworzeniu na tablice). Tak w ogole, to dlaczego od razu nie uzyc TreeMap(Comparator<? super K>)</i>?

0
ws napisał(a)

J.w., z tym, ze Collator juz sam implementuje interfejs Comparator, wiec jesli nie potrzebujesz porownywac calych Map.Entry, nie trzeba przeciazac metod. Wystarczy tez posortowac wylacznie klucze mapy, np. Arrays.sort(T[], Comparator<? super T>) (po wyciagnieciu ich zbioru i przetworzeniu na tablice). Tak w ogole, to dlaczego od razu nie uzyc TreeMap(Comparator<? super K>)</i>?

Nie można użyć obiektu klasy Collator bezpośrednio, gdyż w ten sposób będziemy mogli posortować tylko klucze. Stracimy powiązanie pomiędzy kluczami i wartościami (no chyba, że będziemy na koniec robić get(klucz) dla każdego klucza).

Natomiast co do TreeMap, to jak najbardziej OK. Chociaż uważam, że HashMap + ArrayList + sort będzie szybsze w większości przypadków.

0
__krzysiek85 napisał(a)

Nie można użyć obiektu klasy Collator bezpośrednio, gdyż w ten sposób będziemy mogli posortować tylko klucze. Stracimy powiązanie pomiędzy kluczami i wartościami (no chyba, że będziemy na koniec robić get(klucz) dla każdego klucza).

W pelni sie zgadzam. Wlasnie dlatego

ws napisał(a)

wiec jesli nie potrzebujesz porownywac calych Map.Entry, nie trzeba przeciazac metod.

__krzysiek85 napisał(a)

Natomiast co do TreeMap, to jak najbardziej OK. Chociaż uważam, że HashMap + ArrayList + sort będzie szybsze w większości przypadków.

Tutaj rowniez przyznaje racje. W tym konkretnym przypadku efektywniej bedzie po prostu posortowac wypelniona kolekcje niz uzyc TreeMap.
Pozdr.

0

Wszystkim bardzo dziękuję :-) [browar]
Pozdrawiam.

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