[Java] Prośba o ocene, porady.

0

Witam,

Nie ma na forum co prawda działu gdzie można wrzucać kod do oceny jego poprawności, wydajności dlatego temat założyłem tutaj mam nadzieje, że nie zostanie usunięty. Kod jest realizacją zadania maturalnego z informatyki 2010 z poziomu rozszerzonego. Prosiłbym o jego ocene, krytyke i porady co można zrobić lepiej. Dodałem komentarze dla lepszego zrozumienia mojego toku myślenia.

Treść zadania:
http://img256.imageshack.us/i/95854068.jpg/

Kod:

 import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.PrintStream;
import java.util.ArrayList;
import java.util.StringTokenizer;


public class Anagramy {
	public static void main(String[] args) {
		try {
			ArrayList<String> ListaSlow = new ArrayList<String>();
			Anagram AN = new Anagram();
			
			FileReader FR = new FileReader(new File("anagram.txt"));
			BufferedReader BR = new BufferedReader(FR);
			
			PrintStream PS = new PrintStream(new File("odp_4a.txt"));
			PrintStream PS2 = new PrintStream(new File("odp_4b.txt"));
			
			String linia = null;
			
			//Pobieram linie z pliku
			while((linia = BR.readLine()) != null) {
				// Rozdzielam linie na pojedyńcze słowa
				StringTokenizer ST = new StringTokenizer(linia, " ");
				// Zapisuje je do listy
				while(ST.hasMoreTokens()) {
					ListaSlow.add(ST.nextToken());
				}
				// Sprawdzam czy mają taką samą długość
				if(AN.slowa(ListaSlow)) PS.println(linia);
				// Sprawdzam czy wszystkie wyrazy w wierszu są anagramami
				if(AN.anagramy(ListaSlow)) PS2.println(linia);
				// Czyszcze liste
				ListaSlow.clear();
			}
		}
		catch(IOException e) {
			
		}
	}
}
class Anagram {
	public boolean slowa(ArrayList<String> Lista) {
		int dlugosc = 0;
		boolean jest = true;
		for(int i = 0; i < Lista.size(); i++) {
			// Pobieram słowo z listy
			String slowo = Lista.get(i);
			// Jeśli to pierwszy wyraz jego długość posłuży jako wzorzec
			if(i == 0) dlugosc = slowo.length(); 
			else {
				// Jeśli słowa mają różną długość zwróć fałsz
				if(slowo.length() != dlugosc) {
					jest = false;
					break;
				}
			}
		}
		return jest;
	}
	public boolean anagramy(ArrayList<String> Lista) {
		boolean jest = true;
		//Pierwszy wyraz w wierszu
		String wzorzec = null;
		for(int i = 0; i < Lista.size(); i++) {
			// kolejne wyraz
			String slowo = Lista.get(i);
			int dlSlowa = slowo.length();
			int cz = 0;
			// jesli pierwszy w wierszu bierze jako wzorzec
			if(i == 0) wzorzec = Lista.get(i);
			else {
				// jesli dlugosc wzorca i dlugosc kolejnego wyrazu sie roznia przerywa i zwraca fałsz
				if(wzorzec.length() != dlSlowa) {
					jest = false;
					break;
				}
				else {
					// Porównuje każdy znak ze wzorca z innym znakiem w obecnym slowie
					for(int j = 0; j < wzorzec.length(); j++) {
						for(int k = 0 ; k < wzorzec.length(); k++) {
							if(wzorzec.charAt(j) == slowo.charAt(k)) cz++;
						}
						
						// jeśli znak nie wystąpil ani razu znaczy to, że wyrazy nie są anagramami
						if(cz == 0) {
							jest = false;
							break;
						}
						cz = 0;
					}
				}
			}
		}
		return jest;
	}
}

0

Podstawowa zasada, którą NALEŻY się kierować przy pisaniu programów jest taka: "Jeżeli coś jest głupie, ale działa, to nie jest głupie".
Pierwsza rzecz, co się rzuca w oczy: brak zgodności nazw zmiennych z konwencją, powinny być lowerCamelCase.
Druga: skoro wybierasz linie ze słowami o tej samej długości i okazuje się, że linia taką nie jest, to na pewno nie ma w niej anagramów.
Trzecia rzecz: sam algorytm porównywania słów jest klasy n^2. Tymczasem słowa można posortować (klasa nlog(n) ) i porównać (klasa co najwyżej n).
I tyle :)

0

Z długością lini rzeczywiście masz racej, nie pomyślałem o tym. Co do nazewnictwa to jeśli się nie będzie konsekwentnym to robi sie bałagan, będe pamiętał o tym na przyszłość.
dzięki za odp

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