Java:在for循环中调用类

标签 java class loops actionlistener

我刚刚开始学习 Java,所以如果这个问题有些基础,我深表歉意,并且我确信我的代码不够干净。我一直在尝试编写一个小测验程序,该程序将从 txt 文件( verblist.txt )输入德语动词列表。文本文件的每一行包含五个字符串:德语动词 ( verbger )、英语翻译 ( verbeng )、praeteritum 和 perfekt 动词变位 ( verbpraeverbperf ) 以及是否使用 haben 或 sein作为助动词( HS ,存储为 verbhaben )。通过生成随机数并选择二维数组的“行”来选择动词集。 GUI 然后显示前两个变量,用户必须输入后三个变量。如果最后三个与 txt 文件中的值匹配,用户将得到正确的结果并继续处理另一个动词。

我正处于代码按照我想要的方式工作的时刻 - 对于一个动词。我的组织方式是分两个类。一、VerbTable ,将文本文件导入为二维数组,另一个 RunVerb ,生成 GUI 并使用 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 的新类吗?类(class)?如果是这样,最好的方法是什么?

我希望这是有道理的!谢谢!

最佳答案

要完全按照随机顺序遍历所有动词,您可能不希望每次都生成随机数,因为随机数可能会重复。您必须创建动词的随机排列,一种方法是 Collections.shuffle

参见http://download.oracle.com/javase/6/docs/api/java/util/Collections.html

此外,您不必创建新的 RunVerb 对象,只需创建一次,然后使用 setter 来更改 UI 和操作监听器的功能。所以伪代码是

  Collections.shuffle(verbsList);
  for(verb : verbsList)
  {
  setLabel1(verb[0]);
  setLabel2(verb[1]);...
  }

关于Java:在for循环中调用类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7133689/

相关文章:

java - 当使用 Integer 键迭代 HashMap 时,它总是按升序返回键吗?

class - 如何在Scala构造函数中声明类型别名?

java - 从对象转换为原始类

java - 使用 Spring MVC 在 JSP 页面中显示一组对象

java - 在 Android 中保存和恢复首选项列表

java - 如何知道Java类是否已初始化

c++ - 将类函数连接到按钮。(QT C++)

javascript - 如何简化冗长的代码?

python - 如何在for循环中用空格分隔值

javascript - 如何在 Javascript 循环中触发的回调函数中抛出一次错误?