Diskuze: Práca s .txt dokumentom

Java Java Práca s .txt dokumentom

Avatar
sunspinx
Člen
Avatar
sunspinx:

Zdravím,

začínam po roku pracovať s textovým dokumentom. Takže jedná sa o to, že mám 2 Stringové polia - jeden na české slová a ďalší na ich preklad do AJ.

Textový dokument je vo forme:

achievement:úspěch.
advertisment:re­klama.

Chcem z textového dokumentu uložiť 1. slovo na riadku do enslova pola a 2. slovo za ":" do czslova pola.

Trieda vyzerá následovne.

public class Slovicka {
    String unitfile;
    String czslova[], enslova[];
    int pocetRiadkov;

    public void getVolbu(String volba) {
        if(volba.equals("Unit 1"))
        {
            unitfile = "unit1.txt";
            countLines();
        }
        if(volba.equals("Unit 2"))
        {
            unitfile = "unit2.txt";
            countLines();
        }
    }

    public void countLines() {
        try {
            BufferedReader reader = new BufferedReader(new FileReader(unitfile));
            int lines = 0;
            while (reader.readLine() != null) lines++;
            pocetRiadkov = lines;
            reader.close();
        }
        catch(FileNotFoundException ex) {
            System.err.println("Subor nebol najdeny");
        }
        catch(IOException ex) {
            System.err.println("Nejaka chyba :D");
        }
        readtxtFile();
    }

    public void readtxtFile() {
        try {
            BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(unitfile), "UTF8"));
            czslova = new String[pocetRiadkov];
            enslova = new String[pocetRiadkov];
            int r;
            while ((r = br.read()) != -1)
            {
                char ch = (char) r;
                System.out.print(ch);
            }
        }
        catch (Exception e)
        {
            System.err.println("Chyba pri citani.");
        }
    }
}

Za každú pomoc a radu budem vďačný.

 
Odpovědět 16. ledna 1:58
Avatar
Atrament
Člen
Avatar
Odpovídá na sunspinx
Atrament:

Jelikož jsi nenapsal s čím konkrétně potřebuješ pomoct nebo co ti není jasné, tak jen pár všobecných připomínek:

Místo polí pro jednotlivá slova použij Collections, konkrétně TreeMap se vyloženě nabízí pokud má jít o jednosměrný slovník (z angličtiny do češtiny). Do TreeMap vkládáš jednotlivé prvky, které se skládají z klíče a hodnoty - v tvém případě bude klíč anglické slovo a hodnota české slovo. TreeMap se postará o to abys tam neměl duplicitní klíče, aby byly defaultně seřazené podle abecedy a vyhledávání v TreeMap je prosté get(klíč) co vrátí hodnotu klíče:

TreeMap<String, String> slovnik = new TreeMap<>();
slovnik.put("achievement", "úspěch");
slovnik.put("advertisment", "reklama");
...
slovnik.get("achievement"); //vrátí úspěch

Soubor čti po řádcích a ne po znacích:

String line;
  while ((line = br.readLine()) != null) {

Řádek pak prostě splitni na té dvojtečce a vznikne ti pole o dvou prvcích, první bude anglické slovo a druhé české:

String[] words = line.split(":");
 
Nahoru Odpovědět  +1 16. ledna 11:15
Avatar
sunspinx
Člen
Avatar
Odpovídá na Atrament
sunspinx:

Ďakujem, potreboval som to čítanie po riadkoch a metódu split. Každopádne dokončil som alfa verziu app, čo som chcel urobiť, posielam kód, ak máš čas bol by som vďačný ak by si ho pozrel a povedal mi, čo treba vylepšiť (kvalita kódu) nakoľko v OOP a JavaFX sa dá povedať, že som začiatočník.

public class Main extends Application {

    Stage window;
    Scene scene;
    ComboBox vyberUnit;
    Button potvrd;
    Label autor, nazov;

    @Override
    public void start(Stage primaryStage) throws Exception {
        Slovicka slov = new Slovicka();

        StackPane botLayout = new StackPane();
        autor = new Label();
        autor.setText("Created by Vladislav Domin for Magdalena Maršálková");
        botLayout.getChildren().addAll(autor);

        GridPane midLayout = new GridPane();
        vyberUnit = new ComboBox<>();
        vyberUnit.setPromptText("Vyber si Unit");
        vyberUnit.getItems().addAll(
                "Unit 1",
                "Unit 2"
        );

        GridPane.setConstraints(vyberUnit, 0, 0);

        potvrd = new Button();
        potvrd.setText("Potvrdit");
        potvrd.setOnAction(e -> {
            slov.getVolbu(vyberUnit.getValue().toString());
            e.consume();
        });

        GridPane.setConstraints(potvrd, 0, 1);


        midLayout.getChildren().addAll(vyberUnit, potvrd);
        midLayout.setPadding(new Insets(10,10,10,10));


        BorderPane layout = new BorderPane();
        layout.setBottom(botLayout);
        layout.setCenter(midLayout);
        scene = new Scene(layout, 300, 100);
        window = primaryStage;
        window.setTitle("Vocabulary Learning 0.1.0");
        window.setResizable(false);
        window.setScene(scene);
        window.show();
    }


    public static void main(String[] args) {
        launch(args);
    }

}
public class Slovicka {
    String unitfile;
    String czslova[], enslova[];
    int pocetRiadkov;
    Stage window;
    Scene scene;

    public void getVolbu(String volba) {
        if(volba.equals("Unit 1"))
        {
            unitfile = "unit1.txt";
            countLines();
        }
        if(volba.equals("Unit 2"))
        {
            unitfile = "unit2.txt";
            countLines();
        }
    }

    public void countLines() {
        try {
            BufferedReader reader = new BufferedReader(new FileReader(unitfile));
            int lines = 0;
            while (reader.readLine() != null) lines++;
            pocetRiadkov = lines;
            reader.close();
        }
        catch(FileNotFoundException ex) {
            System.err.println("Subor nebol najdeny");
        }
        catch(IOException ex) {
            System.err.println("Nejaka chyba :D");
        }
        readtxtFile();
    }

    public void readtxtFile() {
        try {
            BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(unitfile), "UTF8"));
            czslova = new String[pocetRiadkov];
            enslova = new String[pocetRiadkov];
            String riadok;
            int it = 0;
            while((riadok = br.readLine()) != null) {
                String slova[] = riadok.split(":");
                enslova[it] = slova[0];
                czslova[it] = slova[1];
                it++;

                if(slova.length != 2)
                    System.err.println("Upravte textovy dokument podla predlohy");

            }
        }
        catch (IOException e)
        {
            System.err.println("Chyba pri citani.");
        }
        display();
    }
    TextField tfEN;
    TextField tfCZ;
    Label lblinfo;

    public void display() {

        tfEN = new TextField("EN slovo");
        GridPane.setConstraints(tfEN, 0, 0);
        tfCZ = new TextField("CZ slovo");
        GridPane.setConstraints(tfCZ, 2, 0);
        Button btnUkaz = new Button("Ukaz Odpoved");
        btnUkaz.setOnAction(f -> {
            ukaz();
            f.consume();
        });
        GridPane.setConstraints(btnUkaz, 0, 1);
        Button btnGeneruj = new Button("Generuj");
        btnGeneruj.setOnAction(f -> {
            generuj();
            f.consume();
        });
        GridPane.setConstraints(btnGeneruj, 0, 2);

        Button btnPotvrd = new Button("Potvrd");
        btnPotvrd.setOnAction(f -> {
            potvrd();
            f.consume();
        });
        GridPane.setConstraints(btnPotvrd, 2, 1);
        lblinfo = new Label();
        GridPane.setConstraints(lblinfo, 2, 3);

        Stage window = new Stage();
        GridPane layout = new GridPane();
        layout.getChildren().addAll(tfEN,tfCZ, btnUkaz, btnGeneruj, btnPotvrd, lblinfo);
        scene = new Scene(layout, 400, 100);
        window.setTitle("Vocabulary Learning 0.1.0");
        window.setResizable(false);
        window.setScene(scene);
        window.showAndWait();
    }


    int nc, ni;
    private void generuj() {
        Random random = new Random();
        nc = random.nextInt(2); // nahodne cislo
        ni = random.nextInt(pocetRiadkov); // nahodny index pola
        lblinfo.setText(null);

        if(nc == 0) // ANJ do CZ
        {
            tfEN.setEditable(false);
            tfEN.setText(enslova[ni]);
            tfCZ.setEditable(true);
            tfCZ.setText(null);
            tfCZ.setPromptText("Preloz do CZ");
        }
        else // CZ do ANJ
        {
            tfCZ.setEditable(false);
            tfCZ.setText(czslova[ni]);
            tfEN.setEditable(true);
            tfEN.setText(null);
            tfEN.setPromptText("Preloz do EN");
        }
    }
    private void potvrd() {
        if(tfEN.getText().isEmpty() || tfCZ.getText().isEmpty()) {
            lblinfo.setText("Treba vyplnit obe polia");
        }
        else {
            if(tfCZ.getText().equals(czslova[ni]) && tfEN.getText().equals(enslova[ni]))
                lblinfo.setText("Spravne :-)");
            else
                lblinfo.setText("Nespravne :-(");
        }
    }
    private void ukaz() {
    tfEN.setText(enslova[ni]);
    tfCZ.setText(czslova[ni]);

    }
}
 
Nahoru Odpovědět 16. ledna 18:38
Avatar
Atrament
Člen
Avatar
Atrament:

Tak z hlediska OOP není moc co hodnotit, protože jsi objektový přístup nijak zvlášť nevyužil. Máš to celé ve dvou třídách s názvy Main a Slovicka. Přitom obě třídy dělají tak nějak všechno a vlastně nic co by přímo souviselo s jejich názvem. OOP vyžaduje důslednou dělbu práce - proto bys měl celý program navrhnout tak, aby jeho jednotlivé části, třídy, dělaly každá něco a jenom to jedno, nic víc. Taky bys měl oddělit gui od dat. Takže v nějaké další iteraci, pokud se chceš opravdu naučit programovat v Javě, by ses měl zamyslet nad tím jak ten celek rozdělit. Měl bys mít přinejmenším jednu třídu zajišťující gui, jednu pro práci s daty a jednu co to pospojuje dohromady.

Přečti si něco o MVC (je tu o tom článeček http://www.itnetwork.cz/…avrhovy-vzor ) a zkus ten program navrhnout podle těchto zásad. Možná by se mohlo zdát, že je to na tak jednoduchém prográmku trochu overkill, ale právě že takovéto jednoduché prográmky jsou nejlepší způsob jak si hned z kraje osvojit ten 'správný postup jak na to'. Později, když se ti bude ten prográmek rozrůstat, nebo se pustíš do něčeho jiného, komplikovanějšího, to jenom oceníš.

Škoda že ses rozhodl to dělat v JavaFX, s tou moc nekamaradím, takže nebudu schopen moc radit v tomhle směru.

Akceptované řešení
+20 Zkušeností
+1 bodů
Řešení problému
 
Nahoru Odpovědět  +1 17. ledna 0:08
Avatar
sunspinx
Člen
Avatar
sunspinx:

Ďakujem, začnem to pomaly prerábať, aby to bolo pekne napísané čiže oddeliť tie veci do tried. Ten článok si určite prečítam.

 
Nahoru Odpovědět 17. ledna 10:05
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 5 zpráv z 5.