我刚刚开始学习 Java,所以如果这个问题有些基础,我深表歉意,并且我确信我的代码不够干净。我一直在尝试编写一个小测验程序,该程序将从 txt 文件( verblist.txt
)输入德语动词列表。文本文件的每一行包含五个字符串:德语动词 ( verbger
)、英语翻译 ( verbeng
)、praeteritum 和 perfekt 动词变位 ( verbprae
和 verbperf
) 以及是否使用 haben 或 sein作为助动词( H
或 S
,存储为 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/