Witam, mam pytanie - chcialbym z tekstu wczytanego z pliku wylowic najczesciej wystepujace zdania. Na przyklad 2 listy zawierajace tytuly gier - jesli jakis tytul wystapi na obu, chcialbym to wylapac.
Zastanawialem sie jak to zrobic i najlatwiej mozna chyba tak: wczytac pliki do tablic i po kolei porownywac - wziac string o indeksie 0 z tablicy 1, porownac ze stringiem o indeksie 0 z tablicy 2, potem ze stringiem o indeksie 1 z tablicy 2, itd. Jesli porownanie da "true", zapisac dany string i liczbe wystapien.
Takie rozwiazanie mozna chyba stosowac do krotkich list i malej ilosci list. Gdybym jednak mial 100 list, kazda z wieloma tytulami? Jak to najlepiej zrobic? Czy jest w Javie jakies gotowe narzedzie do takich zabaw?
Może HashMap<String,Integer>, jeśli w kolekcji nie ma szukanego Stringu s, to dopisujesz (s,1), jeśli jest, to zwiększasz licznik o 1.
Podaj przykład, bo nie za bardzo rozumiem mieszania "zdań" z "tytułami".
Ok, przyklad:
lista1.txt, zawartosc:
starcraft: brood war, warcraft 3, grim fandango, c&c: red alert
lista2.txt, zawartosc:
doom 2: hell on earth, lemmings, world of warcraft, grim fandango
Cel: porownac oba pliki, dostac wynik typu: grim fandango - 2, starcraft: brood war - 1, etc.
Piszac "zdania" i "tytuly" mialem na mysli tytuly skladajace sie z wielu wyrazow, przepraszam za niejasny opis.
No do dokładnie tak, jak napisał @bogdans. Tylko sam siebie wprowadzasz w błąd - nie chcesz porównywać, tylko zliczać wystąpienia tych gier ;)
Wczytujesz kolejno pliki, dla każdego z nich wczytujesz linie, każdą linię wsadzasz - zgodnie z algorytmem zaproponowanym przez @bogdans - do HashMapy a potem tylko wyciągasz wartości dla każdej z gier po kolei.
No tak, zliczanie poprzez porownywanie :)
Co do pomyslu z HashMap - rozumiem, ze wszystkie pliki otwieram (moze ich byc duzo), czytam po linii (tych tez moze byc sporo), wrzucam wszystko do jednej kolekcji. Ale dalej chyba nie lapie, mozecie troche obszerniej? Jak wyciagnac z tej ogromnej kolekcji powtarzajace sie elementy i zliczac ilosc powtorzen kazdego elementu?
HashMap<String,Integer> games = new HashMap<String,Integer>();
...
if(games.containsKey(line))
{
games.put(line, games.get(line)+1);
}
else
{
games.put(line,1);
}
Dokładnie tak, jak napisał bogdans :) HashMapa to taka kolekcja przechowująca pary - w tym wypadku Twoje słowo i licznik wystąpień tego słowa. Potem, żeby się dowiedzieć, ile razy dane słowo wystąpiło, pobierasz wartość licznika skojarzoną z danym słowem i tyle :)
Chyba lapie, dzieki. Jeszcze cos - jak rozumiem HashMap nie dba o kolejnosc elementow, wiec po dodaniu wszystkich linii z wszystkich plikow musialbym recznie wybierac wartosc zmiennej line? Czy jakos elegancko przeiterowac cala kolekcje porownujac wszystko ze wszystkim? W zwyklej tablicy to calkiem proste - zaczynam od zerowego indeksu pierwszej tablicy i porownuje z wszystkimi indeksami drugiej tablicy, potem biore kolejny indeks pierwszej tablicy, porownuje ze wszystkimi indeksami drugiej tablicy, itd. Jak przy uzyciu HashMap?
Nie rozumiem co to znaczy ręcznie wybierać.
Jeśli interesuje Cię konkretna gra, to
System.out.println("grim fandango - "+games.get("grim fandango"));
Jeśli wszystkie gry, to
Set<String> names = games.keySet();
for(String name: names)
{
System.out.println(name+" - "+games.get(name));
}