Gyakorlati alapok III.
Collection példakód - Anagrammák keresése
Ebben a fejezetben anagrammák kereséséről lesz szó.
Anagrammának nevezzük az azonos betűkből álló, de különböző betűsorrendű
(értelmes) szavakat. Tehát ekkor a betűk bár megkeverednek, mégis értelmes
szót fog eredményezni, például bajsza-szabja, gyomorrontás-toronymorgás.
Feladatok
Kérjen be a felhasználótól egy szót! A Szotar.txt állomány szavaiból keresse meg a szó anagrammáit (a szót önmagát is annak tekintve)! Ha van találat, azokat egymás alá írja ki a képernyőre, ha nincs találat, akkor írja ki a „Nincs a szótárban anagramma” szöveget vagy ehhez hasonlót!
A Szotar.txt sikeres eléréséhez és olvasásához az állományt tegyük be a projektmappába (az állomány anagrammákból áll):
A main() főprogramban kommentelve hagytam 2 sort:
//System.out.println(eredetiSzavak);
//System.out.println();
Ha ki akarjuk írni az eredeti Szotar.txt adatbázist is, vegyük ki a kommentjeleket a sorok elejéről.
Nézzük meg a futtatható Java-kódot:
import java.io.*;
import java.util.*;
public class Main {
private static List<String> szavakBeolvasasa() {
List<String> eredetiSzavak = new ArrayList<>();
try {
BufferedReader olvaso = new BufferedReader(new FileReader("szotar.txt"));
String sor;
while ((sor = olvaso.readLine()) != null) {
eredetiSzavak.add(sor);
}
olvaso.close();
} catch (IOException e) {
e.printStackTrace();
}
return eredetiSzavak;
}
private static String szoBekeres() {
Scanner scanner = new Scanner(System.in);
System.out.println ("Kérem, hogy adja meg a szót!");
String szo = scanner.nextLine();
return szo;
}
private static String karakterRendezesListaval(String eredetiSzo) {
List<Character> karakterLista = new ArrayList<>();
for (int i = 0; i < eredetiSzo.length(); i++) {
karakterLista.add(eredetiSzo.charAt(i));
}
Collections.sort(karakterLista);
StringBuilder iro = new StringBuilder();
for (Character c : karakterLista) {
iro.append(c);
}
return iro.toString();
}
public static void main(String[] args) {
boolean vanTalalat = false;
List<String> eredetiSzavak = szavakBeolvasasa();
//System.out.println(eredetiSzavak);
//System.out.println();
String bekertSzo = szoBekeres();
System.out.println();
for (String eredetiSzo : eredetiSzavak) {
String eredetiSzoABC = karakterRendezesListaval(eredetiSzo);
String bekertSzoABC = karakterRendezesListaval(bekertSzo);
if (eredetiSzoABC.equals(bekertSzoABC)) {
System.out.println("Van találat: " + eredetiSzo);
vanTalalat = true;
}
}
if(vanTalalat == false) {
System.out.println("\nNincs a szótárban anagramma!");
}
}
}
Végeredmény:
Kérem, hogy adja meg a szót!
bajsza
Van találat: bajsza
Van találat: szabja