Set<String>和JTextField

import javax.swing.*;
import java.awt.*;
import java.util.HashSet;
import java.util.Set;
import java.util.Timer;
import java.util.TimerTask;

public class Sizeyunsuan {
    public static void main(String[] args) {
        int i = 1;
        Set<String> generatedQuestions = new HashSet<>(); // 用于存储已生成的题目
        int[] answers = new int[30]; // 用于存储每道题的答案

        String[] questionArray = new String[30]; // 用于存储每道题
        JTextField[] answerFields = new JTextField[30]; // 用于存储每道题的答案框

        while (i <= 30) {
            int num1 = (int) (Math.random() * 100);
            int num2 = (int) (Math.random() * 100);
            String question = ""; // 存储生成的题目
            int answer = 0; // 存储答案

            if (i <= 5) {
                question = num1 + " + " + num2 + " = ?"; // 加法
                answer = num1 + num2;
            } else if (i <= 10) {
                // 确保 num1 大于 num2
                if (num1 < num2) {
                    int temp = num1;
                    num1 = num2;
                    num2 = temp;
                }
                question = num1 + " - " + num2 + " = ?"; // 减法
                answer = num1 - num2;
            } else if (i <= 20) {
                if (num1 * num2 < 1000) {
                    question = num1 + " * " + num2 + " = ?"; // 乘法
                    answer = num1 * num2;
                }
            } else if (i <= 30 && num2 * num1 != 0 && num1 != num2) {
                if (num1 % num2 == 0) {
                    question = num1 + " / " + num2 + " = ?"; // 除法
                    answer = num1 / num2;
                }
            }

            // 检查题目是否重复
            if (!question.isEmpty() && !generatedQuestions.contains(question)) {
                generatedQuestions.add(question); // 添加题目到集合中
                answers[i - 1] = answer; // 保存答案
                questionArray[i - 1] = question; // 保存题目
                answerFields[i - 1] = new JTextField(10); // 创建答案输入框
                i++; // 仅在成功添加新题目时才增加计数器
            }
        }

        // 创建一个面板来显示所有问题和输入框,设置为六行五列
        JPanel panel = new JPanel();
        panel.setLayout(new GridLayout(6, 5)); // 设置网格布局

        for (int j = 0; j < 30; j++) {
            panel.add(new JLabel(questionArray[j])); // 添加题目标签
            answerFields[j] = new JTextField(10); // 创建答案输入框
            panel.add(answerFields[j]); // 添加答案输入框
        }

        // 获取用户输入的答题时间
        String timeInput = JOptionPane.showInputDialog(null, "输入答题时间(秒):");
        int timeLimit;

        try {
            timeLimit = Integer.parseInt(timeInput);
            if (timeLimit <= 0) {
                throw new NumberFormatException();
            }
        } catch (NumberFormatException e) {
            JOptionPane.showMessageDialog(null, "请输入一个有效的正整数!", "输入错误", JOptionPane.ERROR_MESSAGE);
            return;
        }

        // 启动倒计时
        final int[] remainingTime = {timeLimit};
        Timer countdownTimer = new Timer();
        countdownTimer.scheduleAtFixedRate(new TimerTask() {
            @Override
            public void run() {
                if (remainingTime[0] > 0) {
                    remainingTime[0]--;
                } else {
                    // 时间到时,显示提示并结束答题
                    JOptionPane.showMessageDialog(null, "时间到!", "提示", JOptionPane.WARNING_MESSAGE);
                    countdownTimer.cancel(); // 倒计时结束时取消定时器
                    checkAnswers(questionArray, answers, answerFields); // 检查答案并显示结果
                    JOptionPane.getRootFrame().dispose(); // 关闭对话框
                }
            }
        }, 0, 1000); // 每秒更新一次

        // 显示问题和答案输入框的对话框
        int result = JOptionPane.showConfirmDialog(null, panel, "填写答案", JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE);

        // 停止计时器
        countdownTimer.cancel(); // 如果用户完成答题或时间到,停止倒计时

        if (result == JOptionPane.OK_OPTION) {
            checkAnswers(questionArray, answers, answerFields); // 检查答案并显示结果
        }
    }

    // 检查答案并显示结果
    private static void checkAnswers(String[] questionArray, int[] answers, JTextField[] answerFields) {
        StringBuilder resultText = new StringBuilder("答题情况:\n");
        int correctCount = 0;

        for (int j = 0; j < 30; j++) {
            String userInput = answerFields[j].getText(); // 获取用户输入的答案
            int userAnswer = userInput.isEmpty() ? 0 : Integer.parseInt(userInput); // 转换用户输入的答案
            resultText.append(questionArray[j]).append(" ");

            // 判断答案
            if (userInput.isEmpty()) {
                resultText.append("未作答,正确答案是:").append(answers[j]).append("\n"); // 未填写的视为错误
            } else if (userAnswer == answers[j]) {
                resultText.append("正确\n");
                correctCount++;
            } else {
                resultText.append("错误,正确答案是:").append(answers[j]).append("\n");
            }
        }

        // 显示校正结果
        JOptionPane.showMessageDialog(null, resultText.toString());
        // 显示成绩
        double correctRate = (correctCount / 30.0) * 100;
        JOptionPane.showMessageDialog(null, "正确率:" + String.format("%.2f", correctRate) + "%");
    }
}

一、解释Set generatedQuestions = new HashSet<>(); :

  1. Set
    Set 是一种集合类型,它用于存储不重复的元素。与列表(如 ArrayList)不同,Set 不允许重复的值。
    指定了集合中存储的元素类型为 String,意味着这个集合将只包含字符串类型的对象。
  2. generatedQuestions
    generatedQuestions 是集合的名称。它用来存储生成的数学题目,以确保题目不会重复。
  3. new HashSet<>()
    HashSet 是 Set 接口的一种具体实现,基于哈希表的原理。它提供了常数时间复杂度的插入、删除和查找操作。
    使用 new HashSet<>() 创建一个新的空的哈希集合实例。
  4. 用途
    在这个程序中,generatedQuestions 用于存储生成的数学题目,确保每道题目都是唯一的。在生成新题目时,程序会检查该题目是否已经存在于 generatedQuestions 集合中。如果题目已经存在,程序将不会将其添加到集 合中,从而避免重复题目。
    代码示例:
import java.util.HashSet;
import java.util.Set;

public class UniqueQuestions {
    public static void main(String[] args) {
        Set<String> generatedQuestions = new HashSet<>();

        // 添加问题
        generatedQuestions.add("2 + 2 = ?");
        generatedQuestions.add("3 + 5 = ?");
        generatedQuestions.add("2 + 2 = ?"); // 重复的问题,不会被添加

        // 输出所有问题
        for (String question : generatedQuestions) {
            System.out.println(question);
        }
        
        // 输出问题的数量
        System.out.println("问题总数: " + generatedQuestions.size());
    }
}

二、解释JTextField[] answerFields = new JTextField[30]; :

  1. JTextField[]
    JTextField 是 Java Swing 中的一个类,用于创建文本输入框。用户可以在文本框中输入文本内容。
    JTextField[] 表示一个 JTextField 对象的数组。这意味着你将创建多个文本输入框,每个文本框可以存储用户输入的字符串。
  2. answerFields
    answerFields 是数组的名称。在这个上下文中,它可以表示用于存储用户输入答案的文本框。
  3. new JTextField[30]
    new JTextField[30] 创建一个新的 JTextField 数组,大小为 30。这意味着你可以存储最多 30 个 JTextField 对象。
    数组的每个元素在初始化时都是 null,你需要分别创建 JTextField 对象并将它们分配给数组的每个元素。
    用途:
    这个数组可以用于处理多个文本输入,例如在一个图形用户界面(GUI)中,用户可以输入答案(例如数学问题的答案)。通过数组,可以轻松地管理和访问这些文本框。
    示例
    以下是一个简单的示例,展示了如何创建 JTextField 数组,并在 JFrame 中添加这些文本框:
import javax.swing.*;
import java.awt.*;

public class AnswerInputExample {
    public static void main(String[] args) {
        // 创建一个 JFrame
        JFrame frame = new JFrame("Answer Input Example");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLayout(new GridLayout(30, 1)); // 设置网格布局

        // 创建一个 JTextField 数组
        JTextField[] answerFields = new JTextField[30];

        // 创建并添加 JTextField 到数组和 JFrame
        for (int i = 0; i < answerFields.length; i++) {
            answerFields[i] = new JTextField("Answer " + (i + 1));
            frame.add(answerFields[i]); // 将 JTextField 添加到 JFrame
        }

        // 设置 JFrame 尺寸并可见
        frame.setSize(400, 600);
        frame.setVisible(true);
    }
}
posted @   呓语-MSHK  阅读(11)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示