Gyakorlati alapok III.

Collection példakód - Anagrammák keresése


Ebben a fejezetben anagrammák kereséséről lesz szó.

 

www.informatika-programozas.hu - Ezt most meg kell tanulni!

 

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):

 

www.informatika-programozas.hu - Letöltés

 

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:

 

www.informatika-programozas.hu - Futtatható Java-kód!

 

 

 

 

 

 

 

 

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