0

このメソッドは、次の質問を GUI にロードすることになっています。

public void readNextEntry() {

    list = new ArrayList<String>();

    scanner = new Scanner(linesFromFile.get(currentQuestion)).useDelimiter(",|\n");
    for (int i = 0; i < 8; i++) {
        list.add(scanner.next());
    }
}

ロード元となるテキスト ファイルの形式は次のとおりです。

001,what color is the sky,it is blue because of precipitation,green,blue,yellow,red,a,   
002,What color are my eyes,they are blue if you look,blue,brown,green,black,a,    
003,What color is the water,it is blue because of water,green,blue,red,yellow,b,

うまくいかないのはなぜですか?001カテゴリ ( )、質問 ( what color is the sky?)、およびその選択肢( )が読み込まれるはずgreen,blue,yellow,redです。私の正規表現はオフですか?

編集: 少しのコンテキスト、これは完全なコードです。このスレッドからの提案を試みていますが、これまでのところ成功していません。

package TestAssignment;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.*;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Scanner;
import javax.swing.*;
import javax.swing.border.Border;

public class TestGui extends JFrame implements ActionListener {

private int counter = 0;
private int totalCount = 0;
private JTextArea question = new JTextArea();
private JTextArea recomendedAnswer = new JTextArea();
private JTextArea category = new JTextArea();
private ArrayList<String> list;
private ArrayList<String> linesFromFile;
private int currentQuestion = 0;
private ButtonGroup group = new ButtonGroup();
private ArrayList<JRadioButton> theButtons;
private JLabel response = new JLabel("");
private JButton answer = new JButton("Answer Question");
private Border border = BorderFactory.createLineBorder(Color.BLACK, 1);
private Scanner scanner;
private String fileName;

public void readNextEntry() {

    list = new ArrayList<String>();

    scanner = new Scanner(linesFromFile.get(currentQuestion)).useDelimiter(",|\n");
    for (int i = 0; i < 8; i++) {
        list.add(scanner.next());
    }
}

public void readFile() {
    linesFromFile = new ArrayList<String>();
    list = new ArrayList<String>();
    try {

        scanner = new Scanner(new File(fileName));
        while (scanner.hasNextLine()) {
            linesFromFile.add(scanner.nextLine());
        }
        Collections.shuffle(linesFromFile);
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }
}

public TestGui(String in) {

    setLayout(new GridLayout(11, 25));
    this.fileName = in;

    add(new JLabel("Category : "));
    JScrollPane scrollPane1 = new JScrollPane(category);
    category.setLineWrap(true);
    category.setBorder(border);
    add(scrollPane1);
    category.setEditable(false);

    //int randomNumber = (int) (Math.random() * 10) + 1;
    //String line = TestGui.readFileByLine("Questions.txt", randomNumber);

    add(new JLabel("Question: "));
    JScrollPane scrollPane2 = new JScrollPane(question);
    question.setLineWrap(true);
    question.setBorder(border);
    add(scrollPane2);
    question.setEditable(false);

    readFile();
    readNextEntry();

    add(new JLabel("Please Select the correct Answer"));

    theButtons = new ArrayList<JRadioButton>();

    for (int i = 0; i < 4; i++) {
        JRadioButton temp = new JRadioButton();
        theButtons.add(temp);
        add(temp);
        group.add(temp);
    }
    refreshButtonLabels();

    add(response);

    category.setText(list.get(0));
    question.setText(list.get(1));

    add(answer);

    answer.addActionListener(this);
   }

  public void refreshButtonLabels() {
    for (int i = 0; i < 4; i++) {
        theButtons.get(i).setText(list.get(i + 3));
    }
  }

    @Override
    public void actionPerformed(ActionEvent e) {
    if (e.getSource() == answer) {
        for (int i = 0; i < theButtons.size(); i++) {
            JRadioButton button = theButtons.get(i);
            if (button.isSelected() && list.get(7).equals("a")) {
                counter++;
                readNextEntry();
            }
            else if (button.isSelected() && list.get(7).equals("b")){
                counter++;
                readNextEntry();
            }
             else if (button.isSelected() && list.get(7).equals("c")){
                counter++;
                readNextEntry();
            }
             else if (button.isSelected() && list.get(7).equals("d")){
                counter++;
                readNextEntry();

            }
        }
    }
     else {
           readNextEntry();
          {
    }
    }





package TestAssignment;

import javax.swing.JFrame;


public class Test {
public static void main(String[] args) {
    TestGui test = new TestGui();
    test.setVisible(true);
    test.setSize(600, 600);
    test.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

}
}
4

2 に答える 2

2

コンマで文字列を単純に分割する方がはるかに簡単です。

String line = linesFromFile.get(currentQuestion);
String[] list = line.split(",\\s*");

スキャナーが邪魔をしています。ただし、スキャナーを使用する場合は、関連するメソッドを最初に呼び出すことなく、そのメソッドいずれかを呼び出さないでください。例えば:nextXXX()hasNextXXX()

while (scanner.hasNext())
{
  list.add(scanner.next());
}

正しく使用すれば、Scanner は NoSuchElementException を決してスローしません。

于 2012-11-24T02:36:41.047 に答える
0

理論的には、これは機能するはずです。紛らわしいのは、スニペットでのみほのめかされている変数のタイプを理解することでした。

static List<String> linesFromFile = new ArrayList<String>();
static {
    linesFromFile.add("001,what color is the sky,it is blue because of precipitation,green,blue,yellow,red,a,");
    linesFromFile.add("002,What color are my eyes,they are blue if you look,blue,brown,green,black,a,");
    linesFromFile.add("003,What color is the water,it is blue because of water,green,blue,red,yellow,b,");
}

public static void main(String[] args) {
    List<String> list = new ArrayList<String>();

    Scanner scanner = new Scanner(linesFromFile.get(1)).useDelimiter(",|\n");
    for (int i = 0; i < 8; i++) {
        list.add(scanner.next());
    }
    System.out.println(Arrays.toString(list.toArray()));
}

プリント[002, What color are my eyes, they are blue if you look, blue, brown, green, black, a]

すでに行で区切られているのに、なぜ「\ n」で区切るのですか?行の1つに、期待しているような十分な要素がないようです。個々の要素を取得する前に(または単にデバッグする前に)行を出力してみてください。

于 2012-11-24T01:06:19.980 に答える