笨方法学 Java -19-综合练习1-实现分析-文字交互处理
作者:谎言诞行    发布时间:2024年02月28日


在上一篇文章中,我们了解了键盘输入的处理。基于这些知识,这里,我们开始介绍字符界面的交互处理。


1、字符界面的交互原理

字符界面(也称为命令行界面)的交互,基本是按照顺序输入或者输出来处理的。其基本情况如下图:

image.png

从图中,我们可以看出,红色的箭头形成一个循环。当输入的信息不匹配,会以循环处理的形式,来继续接收输入,直到接收了符合规则的输入信息。


2、字符界面交互实现

基于上面的流程图,我们写一个简单的实现代码。

public static void main(String[] args) throws Exception {
       //创建读取器
       BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
       Integer result = null;
       //一个循环体
       while(result==null){
              //显示菜单或者提示信息
              System.out.print(">> 请输入一个整数:");
              //获取输入的字符串
              String intStr = reader.readLine();
              //去掉空白字符
              intStr = intStr.replaceAll("\\s+", "");
              //判断是否为整数
              try {
                     result = new Integer(intStr);
              } catch (NumberFormatException e) {
                     System.out.println("ERROR: 输入的内容不是整数,请重新输入!");
              }
       }
       System.out.println("数据识别成功,你输入的是整数:"+result.intValue());
}

代码执行效果如下:

image.png


3、菜单选择的处理

基于上面第2点,我们已经知道如何接收一个菜单序号了。在正式执行之前,我们还需要处理下合规性的问题。比如,菜单是1、2、3、4、5共5个,但是你输入了45,这明显超出正常范围值了。这时候需要再次输入,直到获取到合规的值。

那么我们该如何处理呢?

其实很简单,把规定的菜单序号放入一个整形数组,遍历一次即可。简易的代码如下:

public static void main(String[] args) throws Exception {
       //判断是否合规
       boolean isOk = false;
       //合规的菜单序号
       int[] menuItems = new int[] {1,2,3,4,5};
       //获取到的内容
       int target = 45;
       //循环遍历
       for(int tmp : menuItems) {
              if(tmp==target) {
                     isOk=true;
                     break;
              }
       }
       //输出结果
       System.out.println("数据(target="+target+"),"+(isOk?"合规":"不合规"));
}

注意:

isOk?"合规":"不合规"

这段代码,是 Java 中的三元表达式。如果问号前的条件为true,则为问号后面第一个结果;否则,为第二个结果。


4、完整的菜单处理

通过前面3点,我们已经了解到字符界面交互是如何处理的。现在我们看下完整的代码是怎样的。(代码是从工具类MyIOUtil中截取的静态方法,如果要运行,请自行处理

/**
 * >> 获取键盘输入的菜单序号。如果遇到非菜单序号内容,会循环获取直到输入了合规的序号。
 * @param menuInfo 菜单信息
 * @param menuItem 可输入的数字范围,一个整数数组(最好是0或者正整数,因为负值代表异常)。
 * @return 一个合规的菜单序号,如果程序执行异常,则返回 -1 。
 */
public static int getMenuItem(String menuInfo, int[] menuItem) {
    int result = -1;
    //中间变量
    String tmp = null;
    Integer tmpInt = null;
    //判断参数是否正常
    if(menuInfo!=null && menuInfo.length()>0 && menuItem!=null && menuItem.length>0) {
        //开始循环
        while(true) {
            //输出菜单信息
            System.out.println(menuInfo);
            System.out.print(">> 请输入菜单序号以识别对应操作:");
            //读取一行字符
            try {
                tmp = GLOBAL_READER.readLine();
            } catch (IOException e) {
                System.out.println(":: 获取键盘输入异常,程序将退出运行。异常信息,"+e.getMessage());
                e.printStackTrace();
                System.exit(-1); //退出整个程序。
            }
            //是否为空内容
            tmp = tmp.replaceAll("\\s", "");//替换掉所有空白字符(比如空格,退格等等)
            if(tmp==null || tmp.length()<=0) {
                System.out.println(":: 接收到的输入为空,请重新输入。");
                continue;
            }
            //是否为数字
            try {
                tmpInt = new Integer(tmp);
            } catch (NumberFormatException e) {
                System.out.println(":: 接收到的内容(num="+tmp+")不是整数");
                continue;
            }
            //判断是否合规
            boolean isOk = false;
            for(int i=0;i<menuItem.length;i++) {
                if(tmpInt.intValue()==menuItem[i]) {
                    //数值匹配
                    isOk = true;
                    //跳出for循环
                    break;
                }
            }
            if(isOk) {
                result = tmpInt.intValue();
                //跳出while循环
                break;
            }else {
                System.out.println(":: 你输入的数值(num="+tmpInt.intValue()+")不在正确的菜单序号范围。");
            }
        }
    }else {
        System.out.println(":: 获取的菜单参数为空,menuInfo="+menuInfo+", menuItem="+menuItem);
    }
    return result;
}

 

 


填写一种颜色的字符(不区分大小写),1分钟有效,点击图片刷新