Java: вызов класса в цикле for - PullRequest
0 голосов
/ 20 августа 2011

Я только начал изучать Java, поэтому я прошу прощения, если этот вопрос несколько простой, и я уверен, что мой код не так чист, как мог бы быть.Я пытался написать небольшую программу викторины, которая будет вводить список немецких глаголов из текстового файла (verblist.txt).Каждая строка текстового файла содержит пять строк: немецкий глагол (verbger), английский перевод (verbeng), спряжения спряжения praeteritum и perfekt (verbprae и verbperf) и использует ли он haben или seinкак вспомогательный глагол (H или S, хранится как verbhaben).Набор глаголов выбирается путем генерации случайного числа и выбора «строки» двумерного массива.Затем в графическом интерфейсе отображаются первые две переменные, и пользователь должен ввести последние три.Если последние три соответствуют значениям в текстовом файле, пользователь понимает это правильно и переходит к другому глаголу.

Я нахожусь в точке, где код работает так, как я хочу - для одного глагола.Я организовал это в двух классах.Один, VerbTable, импортирует текстовый файл в виде двумерного массива, а другой, RunVerb, генерирует графический интерфейс и использует ActionListener для сравнения пользовательского ввода с массивом.Сейчас я не могу понять, как после того, как пользователь получит правильный набор глаголов, я смогу выполнить цикл по всему набору глаголов.

Я думал о создании цикла for, который перебирает числострок в текстовом файле (сохраненном в коде как height), каждый раз генерируя новое случайное число для выбора другого набора глаголов (или «строки» в двумерном массиве). По сути, я хотел бы получитьцикл для прохождения через весь класс VerbRun и пауза для ActionListener, пока не будут отображены все наборы глаголов.

Вот VerbTable class, который генерирует массив и случайное число для выбора строки:

package looptest;

import java.io.*;
import java.util.*;

public class VerbTable {
    public int width;
    public int height;
    public int randnum;

    public String verbger = new String("");
    public String verbeng = new String("");
    public String verbprae = new String("");
    public String verbperf = new String("");
    public String verbhaben = new String("");

    public VerbTable() {

        File file = new File("verblist.txt");
        try {
            /* For array height and width */
            Scanner scanner1 = new Scanner(file).useDelimiter("\n");
            int height = 0;
            int width = 0;
            while (scanner1.hasNextLine()) {
        String line = scanner1.nextLine();
        height++;
                String[] line3 = line.split("\t");
                width = line3.length;
            }
            System.out.println("Height: " + height);
            System.out.println("Width: " + width);
            this.width = width;
            this.height = height;
            /* Array height/width end */

            /* random number generator */       
            int randnum1 = 1 + (int)(Math.random() * (height-1)); 
            this.randnum = randnum1;
            /* random number generator end */

            Scanner scanner = new Scanner(file).useDelimiter("\n");

            String verbtable[][];
            verbtable = new String[width][height];

            int j = 0;
                while (scanner.hasNextLine()){

                    String verblist2 = scanner.next();
                    String[] verblist1 = verblist2.split("\t");
                    System.out.println(verblist2);
                    verbtable[0][j] = verblist1[0];
                    verbtable[1][j] = verblist1[1];
                    verbtable[2][j] = verblist1[2];
                    verbtable[3][j] = verblist1[3];
                    verbtable[4][j] = verblist1[4];
                    j++;
               }
                    this.verbger = verbtable[0][randnum];
                    this.verbeng = verbtable[1][randnum];
                    this.verbprae = verbtable[2][randnum];
                    this.verbperf = verbtable[3][randnum];
                    this.verbhaben = verbtable[4][randnum];
     }
        catch (FileNotFoundException e){
            e.printStackTrace();
        }
    }    

public int getRand(){
    return this.randnum;
}      

public int getWidth(){
    return this.width;
}

public int getHeight(){
    return this.height;
}

public String getVerbger(){
    return this.verbger;
}

public String getVerbeng(){
    return this.verbeng;
}

public String getVerbprae(){
    return this.verbprae;
}

public String getVerbperf(){
    return this.verbperf;
}

public String getVerbhaben(){
    return this.verbhaben;
}

    public static void main(String[] args) throws IOException {
    }
}

А вот класс RunVerb:

package looptest;

import java.awt.*;
import javax.swing.*;
import java.awt.event.*; 

public class RunVerb extends JFrame {
VerbTable dimensions = new VerbTable();
int width = dimensions.getWidth();
int height = dimensions.getHeight();
int randnum = dimensions.getRand();
String verbgerin = dimensions.getVerbger();
String verbengin = dimensions.getVerbeng();
String verbpraein = dimensions.getVerbprae();
String verbperfin = dimensions.getVerbperf();
String verbhabenin = dimensions.getVerbhaben();
String HabenSeinSelect = new String("");

public JTextField prae = new JTextField("",8);
public JTextField perf = new JTextField("",8);
public JLabel verbger = new JLabel(verbgerin);
public JLabel verbeng = new JLabel(verbengin);
public JRadioButton haben = new JRadioButton("Haben");
public JRadioButton sein = new JRadioButton("Sein");

public RunVerb() {
    JButton enter = new JButton("Enter");
    enter.addActionListener(new ConvertBtnListener());

    prae.addActionListener(new ConvertBtnListener());
    perf.addActionListener(new ConvertBtnListener());

    JPanel content = new JPanel();
    content.setLayout(new FlowLayout());

    content.add(verbger);
    verbger.setBorder(BorderFactory.createEmptyBorder(15, 20, 15, 20));
    content.add(verbeng);
    verbeng.setBorder(BorderFactory.createEmptyBorder(15, 20, 15, 40));
    content.add(new JLabel("Praeteritum:"));
    content.add(prae);
    content.add(new JLabel("Perfekt:"));
    content.add(perf);

    content.add(haben);
    haben.setBorder(BorderFactory.createEmptyBorder(0, 20, 0, 10));
    haben.setSelected(true);
    content.add(sein);
    sein.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 10));
    ButtonGroup bg = new ButtonGroup();
    bg.add(haben);
    bg.add(sein);

    content.add(enter);

    setContentPane(content);
    pack();                               
    setTitle("Verben");
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setLocationRelativeTo(null); 
}

class ConvertBtnListener implements ActionListener {
    public void actionPerformed(ActionEvent e) {
        String outprae = prae.getText();
        int praenum = 0;
        if (outprae.equals(verbpraein)){
            praenum = 1;
        }

        String outperf = perf.getText();
        int perfnum = 0;
        if (outperf.equals(verbperfin)){
            perfnum = 1;
        }

        boolean habenselect = haben.isSelected();
        boolean seinselect = sein.isSelected();       

        if (habenselect == true){
            HabenSeinSelect = "H";
        }
        else {
            HabenSeinSelect = "S";
        }

        int habennum = 0;
        if (HabenSeinSelect.equals(verbhabenin)) {
            habennum = 1;
        }

        int numtot = praenum + perfnum + habennum;
        if (numtot == 3){
            System.out.println("Correct.");
        }
        else{
            System.out.println("Incorrect.");
        }
        numtot = 0;

    }
}
    public static void main(String[] args) {
        window.setVisible(true);
    }
}

Итак, что было бы лучшим способом циклически проходить по всему массиву verbtable, пока не будут отображены все строки?Должен ли я создать цикл for, и если так, куда он должен идти?Должен ли я создать новый класс, который содержит цикл и ссылается на класс VerbRun?Если это так, что будет лучшим способом для этого?

Надеюсь, это имеет смысл!Спасибо!

Ответы [ 2 ]

1 голос
/ 20 августа 2011

Чтобы пройти все глаголы точно в случайном порядке, вы не можете каждый раз генерировать случайные числа, так как случайное число может повторяться. Вы должны создать случайную перестановку глаголов, один из способов сделать это - Collections.shuffle

см. http://download.oracle.com/javase/6/docs/api/java/util/Collections.html

Кроме того, вам не нужно создавать новый объект RunVerb, вместо этого создайте его один раз и используйте сеттеры для изменения пользовательского интерфейса и функциональности прослушивателей действий. Таким образом, псевдокод будет

  Collections.shuffle(verbsList);
  for(verb : verbsList)
  {
  setLabel1(verb[0]);
  setLabel2(verb[1]);...
  }
0 голосов
/ 20 августа 2011

У меня был бы метод, подобный getNextRandomVerb() в классе VerbTable, который генерирует следующий глагол, который будет показан. Он будет следить за глаголами, которые были показаны (для данного сеанса пользовательского сеанса) и будет гарантировать, что следующий выбранный не повторяется. Ваш класс RunVerb кажется более ответственным за управление графическим интерфейсом, поэтому здесь не место определять, как получить следующий глагол для отображения.

...