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;
}
}