sortowanie w java

0

Witam! Swoją przygodę z javą dopiero zaczynam i mam do napisania aplikację zajmującą się przeszukiwaniem plików tekstowych. Mianowicie mój problem wygląda następująco. Stworzyłam metodę która czyta tekst z textArea a w textArea_4 wyświetla wszystkie niepowtarzalne słowa z tego tekstu. Chciała bym dodatkowo by poszczególna ilość wystąpień danego słowa była zliczana, wyświetlana obok i aby lista była posortowana wg ilości wystąpień. Czy ktoś potrafił by mi podpowiedzieć jak to zrobić.

 public void StworzListeSlow()
		{
		 ArrayList<String> posortowanaLista = new ArrayList<String>();
			String[] tab = textArea.getText().split("\n");
			
			for(int i=0; i< tab.length;i++)
			{
				String[] tab1 = tab[i].split(" ");
				for(int j=0; j< tab1.length; j++)
				{
					posortowanaLista.add(tab1[j]);
				}
			}

			Set<String> bezpowtorzen = new HashSet<String>(posortowanaLista);
			for (String string : bezpowtorzen) {
				textArea_4.append(string+"\n");
			}
			
		}

Mam jeszcze dodatkowe jedno pytanie. W jaki sposób do split można dorzucić jakieś inne znaki, aby nie rozdzielało mi tekstu na tablicę słow jedynie dzięki " ", ale dodatkowo np znaki . , ? ! ...

Z góry wielkie dzięki za pomoc :)

0
  1. Map<String,Integer> do zliczenia słów
  2. Collections.sort() do sortowania
  3. Zamiast split użyć findAll() na wyrażeniu regularnym.
0

Ja osobiście uważam, że najlepiej samemu pokombinować i poszukać rozwiązania .. masz wielkie api javy na necie .. możesz poznać wszystkie metody wszystkich klas .. gdy od początku zaczniesz myśleć samemu to potem wymyślisz rozwiązania dla trudniejszych

zadanie na start .. zrób zwyczajny kalkulator który oblicza każdą frazę wpisaną w stringu .. np ( 2 + 2 ( 2*4+(4-2)/2 ) ) .. jedyne utrudnienie to metoda obliczająca nawias musi być rekurencyjna

No i zasada podstawowa, musisz zrobić sam ;] .. jak zrobisz to możemy w JUnit-ie sprawdzić czy mój pierwszy calc działa szybciej ;p

0

@gore trocheę masz racji, ale raczej pieprzysz. To jest przecież zadanie domowe.
@kolorowa90,

split(" ;,{}.-!");
0

Już ze splitem sobie poradziłam. Wystarczyło dodać
String[] tab1 = tab[i].split("\\W");

Map<String,Integer> również już zastosowałam, z tym że wypisuje mi on podane wartości w jednej linii. Czy dało by się to jakoś rozdzielić tak żeby mi wartości w 2 kolumnach wyświetlało?

 public void StworzListeSlow()
		{
		 Map<String,Integer> posortowanaLista = new HashMap<String, Integer>();
			String[] tab = textArea.getText().split("\n");
			
			for(int i=0; i< tab.length;i++)
			{ 	final String REGEX = "\\W";           
		        Pattern p = Pattern.compile(REGEX);
		        String[] items = p.split(tab[i]);
		        for (String token : items) {
		            Integer counter = posortowanaLista.get(token);
		            if (counter == null) {
		                counter = 0;
		            }
		            posortowanaLista.put(token, ++counter);
		        }				
			}		
				textArea_4.append(posortowanaLista.toString());			
		}

Nie wiem, może dało by się to przypisać do tablicy dwuwymiarowej?

0

Z Map posortowanaLista możesz sobie wyciągnąć kolekcję metodą entrySet i użyć jej w konstruktorze klasy ArrayList. Wtedy listę możesz posortować definiując odpowiednio Comparator, żeby porównywał wartości. Wyświetlanie zrób w pętli for dla każdego Entry w tej liście. Metoda toString z HashMap jak widzisz wyświetla w jednej linii.

0

Dziękuję ślicznie ;) Już wszystko działa jak należy ;)

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