[tablice] liczenie powtórzeń

0

Cześć :)

Staram się napisać program który będzie liczył mi powtórzenia wpisane przez użytkownika.
Np. zostanie wpisane:
ala
kot
ma
ala
kot

To program wyświetli: ala - 2, kot - 2, ma - 1.

Napisałem, jednak działa to w ten sposób, że gdy wpiszę
test
test
test
test2
test2

to wyświetla test - 3, test2 - 1, test2 - 1.
Spróbowałem to zrobić przerywając pętlę for ale to nic nie dało..


import java.util.ArrayList;

import javax.swing.JOptionPane;

public class zabawa_tablicami {

	public static void main(String[] args) {
		ArrayList<String> ar_nazwa = new ArrayList<String>();
		ArrayList<Integer> ar_ilosc = new ArrayList<Integer>();
		String ciag = "";
		int ilosc = 0;
		int rozmiar = 0;
		while ((ciag = JOptionPane
				.showInputDialog("Podaj dowolony ciąg znaków")) != null) {
			rozmiar = ar_nazwa.size();
			if (rozmiar == 0) {
				ar_nazwa.add(ciag);
				ar_ilosc.add(1);
				System.out.println("Pierwszy wpis");
			} else {
				for (int i = 0; i < rozmiar; i++) {
					if (ar_nazwa.get(i).equals(ciag)) {
						ilosc = (int) ar_ilosc.get(i);
						ar_ilosc.set(i, ilosc + 1);
						System.out.println("powtórzenie");
						break;
					}
					if (ar_nazwa.get(i).equals(ciag) == false) {
						ar_nazwa.add(ciag);
						ar_ilosc.add(1);
						break;

					}

				}

			}

		}
		System.out.println(ar_nazwa.size());
		System.out.println(ar_ilosc.size());
		for (int i = 0; i < ar_nazwa.size(); i++) {
			System.out.println(ar_nazwa.get(i) + " występuje "
					+ ar_ilosc.get(i) + " raz(y)");
			// System.out.println(ar_nazwa.get(i));
		}
	}
}
0

Najlepiej żebyś stworzył sobie mapę w której kluczem będą słowa a wartościami liczba ich powtórzeń,jak znajdzie jakieś słowo w kluczach to zinkrementuje wartość jemu odpowiadającą,jak nie to doda je do mapy i ustawi wartość na 1.

0

Masz na myśli HashMap?

0

Nigdy nie używałem HashMap..

Proszę o pomoc jak rozwiązać mój problem z pierwszego postu :)

Albo jakąś podpowiedź :)

0

Troche namotales.
Mozesz sobie zrobic klase:

 class WystapienieWyrazu{
    ...
    ...
    private String wyraz;
    private int num;
}

i co za tym idzie sprawdzac, czy istniej wyraz w ArrayList, jesli tak to zinkrementowac wartosc num poprzez num++

Poza tym dzikie warunki. Sprawdzasz typ boolean i w jednym If sprawdzasz czy true a w drugim czy false. Jak juz cos to zastosuj if.. else. Poza tym tak czy siak od razu wychodzisz z petli bo masz break przy wszystkich mozliwosciach.

0

Ale i tak muszę stworzyć dwie tablice ArrayList? W jednej tablicy wyrazy, w drugiej ilość wystąpień.

A co do warunków to przecież sprawdzam czy istnieje:

ar_nazwa.get(i).equals(ciag)

i dodaje 1 (równie dobrze mogę zrobić ilosc++)

ar_ilosc.set(i, ilosc + 1);

To co tutaj jest źle..? :(

0

@Marcin89, po co dwie?

package pl.koziolekweb.programmers.forum.t153559;

import java.util.HashMap;
import java.util.Map;

public class App {

	public static void main(String[] args) {
		String[] w = new String[]{"Ala", "Ala", "kot"};
		Map<String, Integer> wyrazy = new HashMap<String, Integer>();
		for(String s : w){
			if(wyrazy.containsKey(s)){
				wyrazy.put(s, wyrazy.get(s)+1);
			}
			else{
				wyrazy.put(s, 1);
			}
		}

		System.out.println(wyrazy);
	}

}
0

Dzięki :)

Teraz zrozumiałem jak działa HashMap.

Życzę miłego wieczoru :)

Ah, jeszcze pytanko..
Da się jakoś inaczej wyświetlić dane z HashMap niż pokazanie w ten sposób: {cos=3, dwa=2, raz=1}?

Widzę tylko opcję do wyciągania wartości klucza, a nie samego klucza..

0

Masz metodę keySet(), która zwraca zbiór (Set) wszystkich kluczy.

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