Pliki pliki i jeszcze raz pliki

0

Wczytać plik tekstowy C:\Temp\tekst.txt i policzyć ile razy występują w nim poszczególne słowa.
Raport wypisać na konsoli w alafabetycznje koljeności słów w postaci:
słowo1 liczba_wystąpień
słowo2 liczba_wystąpień
....

np.
w pliku tekst.txt mamy:

Ala ma kota i psa i kota i psa,
psa (ale nie kota)

wynik:

Ala 1
ale 1
i 3
kota 3
ma 1
nie 1
psa 3

Uwaga: obliczanie ma być efektywne, a program zwięzły. Za programy nie spełniające tych warunków (choć działające poprawnie) obniżam punktację o 2 punkty.

Programy nie spełniające wymaganej formy wyniku otrzymują 0 punktów.

Jak to zrobić efektywnie proszę o pomoc.
Zauważcie ,że jak są znaki typu ,. () // to je pomijamy . Mój pomysł to czytam znak po znaku sprawdzam czy różny od wspomianych znaków i jak biały znak to wkładam do stringa , stringi wkladam np. do ArrayList i Sortuje. Ale to chyba ni eoptymalne rozwiązanie

0

Moje udoskonalenie używam String Tokenizera a później Hash Map ??

0

nie zapominaj że zostają ci jeszcze znaki typu $%^&*#@ , domyślam się że je też masz pomijać :P
na mój mózg wrzuć każde słowo do tablicy String, posortuj i z niej od razu wyrzucaj od razu na standardowe wyjście po kolei każde słowo, zliczając jednocześnie ile razy to słowo znajduje się w tej tablicy pod rząd. Wyświetlisz sobie wtedy od razu liczbę tych słów i będziesz miał posortowane.

0

A jak by rozwiązanie wyglądało przy użyciu Tree Seta??

0
Michali napisał(a)

A jak by rozwiązanie wyglądało przy użyciu Tree Seta??

nie wiem ja to napisałem tak:

import java.util.*;
import java.io.*;

public class Search{
	private String []tab;
	
	//konstruktor
	Search(String plik){
		try{
			File a = new File(plik);
			FileInputStream 
				stream = new FileInputStream(a),
				stream2 = new FileInputStream(a);
			int i = stream.read(), spaces = 0;
			while((i == 32 || i == 10) && i != -1 )
				i = stream.read();
			while(i != -1){
				while(i != 32 && i != 10 && i != -1)
					i = stream.read(); //pomija znaki rozne 
				spaces ++; //zlicza ile jest wyrazow w pliku
				while((i == 32 || i == 10) && i != -1)
					i = stream.read();//pomija spacje i RET
			}
			tab = new String[spaces];
			i = stream2.read(); 
		        int j = 0;
			String help = "";
			while((i == 32 || i == 10) && i != -1)
				i = stream2.read();
			while(i != -1){
				while(i >= 48 && i <= 122 && i != -1 && i != 10 && i != 32){
					help += Character.toString((char)i);
					i = stream2.read(); 
				}
				tab[j] = help;
				j++;
				while((i == 32 || i == 10) && i != -1){
					i = stream2.read();//pomija spacje i RET
				}
				help ="";
			}
		}
		catch(NullPointerException e){}
		catch(FileNotFoundException ex){}
		catch(IOException ee){}
	}
	
	public void printx(){
		Arrays.sort(tab);
		int j = 1;
		for(int i = 0; i < tab.length; i++){
			if(i + 1 < tab.length)
				while(tab[i].compareTo(tab[i + 1]) == 0){
			        	i++;
		       			j++;
				}		
			System.out.println(tab[i] + "    wystapil " + j + " razy.");
			j = 1;
		}
	}	
}





 public class aaa{
	public static void main(String[] args){
		Search a = new Search("text.txt");
		a.printx();
	}
}
 
0

A moze tak:

  1. tworzysz HashSet<String> ignored - ze slowami ktore maja byc ignorowane
  2. tworzysz TreeMap<String, Integer> stats
  3. otwierasz plik, wczytujesz linijka po linijce
    3.1 dzielisz linijke na wyrazy metoda String.split(), dostajesz tablice wyrazow
    3.2 iterujesz sie po tej tablicy, sprawdzasz czy dany wyraz znajduje sie w HashSet<String> zadeklarowanym wczesniej
    3.2.1 jesli wyraz tam sie znajuje, to ignorujesz ten wyraz i przechodzisz do kolejnejk iteracji petli po wyrazach
    3.2.2 jesli wyraz tam sie nie znajduje to:
    3.2.2.1 pobierasz z TreeMap<String, Integer> licznik dla danego wyrazu
    3.2.2.2 jesli jest null, to znaczy ze ten wyraz pierwszy raz wystapil, wiec tworzysz nowego inta ustawiasz na 1 i wkladasz do tej mapy
    3.2.2.3 jesli nie jest null, zwiekszasz go o 1 i wkladasz do mapy
  4. drukowanie:
    System.out.println("Slowo\t\tLicznik");
    System.out.println("=======================");
    for (Map.EntrySet<String, Integer> entry : stats) {
    System.out.printf("%s\t\t%d%n", entry.getKey(), entry.getValue());
    }

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