Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: Práca s .txt dokumentom

Aktivity
Avatar
Vladislav Domin:16.1.2016 1:58

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.1.2016 1:58
Avatar
Atrament
Tvůrce
Avatar
Odpovídá na Vladislav Domin
Atrament:16.1.2016 11:15

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
16.1.2016 11:15
Avatar
Odpovídá na Atrament
Vladislav Domin:16.1.2016 18:38

Ď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.1.2016 18:38
Avatar
Atrament
Tvůrce
Avatar
Atrament:17.1.2016 0:08

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í
+2,50 Kč
Řešení problému
 
Nahoru Odpovědět
17.1.2016 0:08
Avatar
Vladislav Domin:17.1.2016 10:05

Ď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.1.2016 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.