关于Java文本随机点名器的问题

大脑一片空白 不知道怎么写出来的 求各位同志帮忙整理一下思路

package com.itheima.test;

import java.io.*;
import java.util.ArrayList;
import java.util.Collections;

public class RandomName4 {
    public static void main(String[] args) throws IOException {
        /*
        * 随机点名程序,第一轮结束后自动开启第二轮
        * 写了一个自动销毁模式,只能运行两次
        * 我也不知道怎么写出来的,求大神帮我整理整理代码思路
        * */
        BufferedReader br = new BufferedReader(new FileReader("count.txt"));
        int count = Integer.parseInt(br.readLine());
        br.close();
        finalGetName(count);
    }

    private static void finalGetName(int count) throws IOException {
        if (count == 1) {
            int size = randomName();
            if (size == 0) {
                writerFile("E:\\Java\\basic-code-next\\myiotest\\out\\production\\myiotest\\myiotest\\name.txt", "name.txt");
                BufferedWriter bw = new BufferedWriter(new FileWriter("count.txt"));
                count++;
                bw.write(count + "");
                bw.close();
                System.out.println("第一次点名结束");
            }
        } else if (count == 2) {
            System.out.println("开启第二轮");
            int size = randomName();
            if (size == 0) {
                File file1 = new File("name.txt");
                file1.delete();
                File file2 = new File("count.txt");
                file2.delete();
                System.out.println("第二次点名完成,结束程序,删除备份文件");
                System.exit(0);
            }
        }
    }


    private static int getCount() throws IOException {
        //计数文本
        BufferedReader br = new BufferedReader(new FileReader("count.txt"));
        BufferedWriter bw = new BufferedWriter(new FileWriter("count.txt"));
        bw.write("1");
        bw.close();
        int count = Integer.parseInt(br.readLine());
        br.close();
        return count;
    }

    private static void writerFile(String oldFile, String newFile) throws IOException {
        BufferedReader br = new BufferedReader(new FileReader(oldFile));
        BufferedWriter bw = new BufferedWriter(new FileWriter(newFile));
        String str;
        while ((str = br.readLine()) != null) {
            bw.write(str);
            bw.newLine();
        }
        bw.close();
        br.close();
    }

    private static int randomName() throws IOException {
        BufferedReader br = new BufferedReader(new FileReader("name.txt"));
        String str;
        ArrayList<String> list = new ArrayList<>();
        while ((str = br.readLine()) != null) {
            list.add(str);
        }
        br.close();

        Collections.shuffle(list);
        if (list.size() != 0) {
            System.out.println(list.get(0));
            list.remove(0);
        }

        BufferedWriter bw = new BufferedWriter(new FileWriter("name.txt"));
        for (String s : list) {
            bw.write(s);
            bw.newLine();
        }
        bw.close();

        return list.size();
    }
}


名字在文件里是一行一个吗,然后每轮随机点名的个数是多少?
可以先查询总共有多少行,然后通过random.nextint 随机出来点名的行

  • 你可以看下这个问题的回答https://ask.csdn.net/questions/646523
  • 这篇博客你也可以参考下:java数组-实现方法:删除数组中第一次出现的指定元素,并返回删除后的数组。
  • 除此之外, 这篇博客: Java判定括号的对称性算法思路解析源码中的 网上大牛写的思路清晰的代码如下: 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • private static int whatParentheses(char ch) {
    		switch (ch) {
    		case '(':
    			return -1;
    		case '[':
    			return -2;
    		case '{':
    			return -3;
    		case ')':
    			return 1;
    		case ']':
    			return 2;
    		case '}':
    			return 3;
    		}
    		return 0;
    	}
    
    	private static boolean isParenthesesValid(String s) {
    		// 字符串为空
    		if (s == null) {
    			return false;
    		}
    		int length = s.length();
    		Stack<Character> stack = new Stack<>();
    		// 存储遍历的字符
    		char ch;
    		// 存储字符转换后的数字
    		int parentNum;
    		// 记录下括号出现的次数
    		int count = 0;
    		for (int i = 0; i < length; i++) {
    			ch = s.charAt(i);
    			parentNum = whatParentheses(ch);
    			if (parentNum < 0) {
    				count++;
    				// <0表示这是个左括号
    				stack.push(ch);
    			} else if (parentNum > 0) {
    				count++;
    				// >0表示这是个右括号
    				if (stack.isEmpty()) {
    					// 右括号左边没有左括号的特殊情况
    					return false;
    				}
    				if (parentNum + whatParentheses(stack.peek()) == 0) {
    					// 栈顶是对应的左括号
    					stack.pop();
    				} else {
    					return false;
    				}
    			} else {
    				// =0 这不是一个括号,不管
    			}
    		}
    		// 字符串中有括号且栈最后被清空了,表示括号成对出现且有效
    		if (count > 0 && stack.isEmpty()) {
    			return true;
    		}
    		return false;
    	}

    对比学习后,还是觉得大牛的思路解析更好,还是得活学活用,做到能举一反三才算是真正的掌握,好了文章就分享到这里,希望能与大家共勉,并能看到文章的各位有一些帮助,我只是一个“知识的搬运工”。

    以下是个人的技术交流群,有兴趣一起学习交流的可以加入

  • 您还可以看一下 汪翠老师的java项目实战之欢乐斗地主游戏开发教程 毕业项目课程设计带源码课程中的 给扑克牌绑定鼠标事件实现单击可以选择出牌列表小节, 巩固相关知识点
  • 以下回答由chatgpt基于相关博客总结生成:

    我将为您提供一种Java文本随机点名器的解决方案。

    思路:

    1.创建存储学生姓名的列表。

    2.将学生姓名放入列表中。

    3.创建一个随机数生成器来随机选择姓名。

    4.创建一个方法来实现不重复的选择,用一个计数器来保证每个人都只被选中一次。

    5.输入选择操作,按下回车键来选择一个名字。

    6.如果选择完成,结束程序。

    代码实现:

    import java.util.ArrayList;
    import java.util.Random;
    import java.util.Scanner;
    
    public class StudentNamePicker {
        public static void main(String[] args) {
    
            //创建一个存储学生姓名的列表
            ArrayList<String> students = new ArrayList<String>();
    
            //将学生姓名放入列表中
            students.add("Tom");
            students.add("Jack");
            students.add("Lucy");
            students.add("Mike");
            students.add("Alan");
            students.add("Kelly");
    
            //创建随机数生成器
            Random random = new Random();
    
            //定义一个计数器,用于保证每个人都只被选中一次
            int count = 0;
    
            System.out.println("按回车键选取一个名字,输入exit退出程序");
            Scanner scanner = new Scanner(System.in);
    
            while(scanner.nextLine().isEmpty()){
    
                //生成随机数
                int index = random.nextInt(students.size());
    
                //保证每个人都只被选中一次
                count++;
                if(count > students.size()){
                    System.out.println("所有人都已被点名,程序退出");
                    break;
                }
    
                //获取选中的名字,并从列表中删除
                String student = students.remove(index);
    
                //输出选中的名字
                System.out.println("选中的名字是:"+student);
    
            }
        }
    }
    

    技术说明:

    1.ArrayList是Java集合框架中的一种实现,用于动态存储对象(可变数组)。

    2.如果输入的字符串为空,那么scanner.nextLine()方法会阻塞等待用户输入,并且将用户输入转换为字符串类型返回。

    3.Random类是Java中的内置类,用于生成伪随机数。

    4.计数器用于保证每个人都只被选中一次。

    5.从列表中删除元素以确保不重复选择。

    6.如果所有姓名都被选中,则退出程序。

    运行说明:

    1.使用JDK编译代码,生成StudentNamePicker.class文件。

    2.在控制台中运行以下命令:

    java StudentNamePicker
    

    3.按下回车键以选择一个名字,程序将随机选择一个姓名并输出到控制台上。

    4.如果所有姓名都被选中,程序将结束。