同学的一道面试题

题目

任务要求:

输入数字并且排序。如果输入英文字母则输出“对不起只能是数字”,不退出还可以继续输入,连续按两次回车输出排序结果。

思路:

第一步

存储输入值
用集合,数组都可以,我在这里用的是集合。

在这里插入代码片
 List<String> li = new ArrayList<String>();

提示用户,需要创建用户输入的类,如:Scanner类,或者InputStreamReader输入流,我在这里用的是后者。

在这里插入代码片
System.out.println("请输入数字:");
     BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));

第二步

判断用户是否输入了两次回车,用count变量进行判断,每输入一次加一次。
当我们判断出用户按了两次回车,用户才不能进行输入,否则就会一直输入下去。需要用到循环,条件就是count !=2;
现在我们进入循环判断
1.判断用户是否输入回车
判断条件就是看输入字符的长度是否为零,为零只能是我们按了回车键。
所有代码为:

在这里插入代码片
      str = bf.readLine();
      if(str.length()==0) {
    
    
       count ++;
      }

count变量是用来判断回车次数的,当count加了两次后再执行判断的时候就会退出输入循环,显示输出排序结果。

2.判断输入的字符是否包含数字,我在这里用了正则表达式

else if(str.matches("[0-9]+")) {
    
    
       count = 0;
       li.add(str);

当判断出用户输入的信息与数字相匹配后,它就会加入集合里。在这里我赋值count为0,在后面的判断都是赋值0,只要判断不是回车都是赋值0,因为我们退出循环的判断条件是连续两次回车退出。所以只要下一次输入不是回车,自然就再从0开始

3.判断输入的字符是否包含字母

else if(str.matches("[A-Za-z]+")) {
    
    
       count = 0;
       System.out.println("对不起只能输入数字");

当判断出用户输入的信息与字母相匹配后,提示用户只能输入数字。

4.判断完了之后剩下的自然就是其他字符,或者是字母数字混合在一起的一些字符。

else {
    
    
       count = 0;
       System.out.println("输出的内容:"+str);
      }
     }while(count != 2);

第三步

这一步我们给集合进行排序,然后遍历输出就算完成了。
我们在这里使用的是List集合,要对List中存储的值进行排序,那怎么排序呢?

Collections是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作。

所以我们可以用到Collections.sort方法对list排序。
那么Collections.sort方法对list排序有两种方法:
第一种是list中的对象实现Comparable接口;一般都是按字的字典序的顺序进行排序,很明显不适合我们数字的排序。
第二种方法是根据Collections.sort重载方法来实现。所有我们需要自己来弄一个排序的方法。

记住升序就是我减他,降序就是他减我

那我们在这里是进行升序,我们先进行判断,数值比较大小肯定是比先长度,那么长度长,位数也就多,值也就最大。那么我们判断分四种情况:
第一种,当前对象的长度大于指定的对象的长度,返回1.
第二种,当前对象的长度小于指定的对象的长度,返回-1
第三种,当前对象和另一个对象是相同的,返回0
第四种,当前对象的长度等于指定的对象的长度。如果在这种情况下,那么我们就可以用Comparable接口下的compareTo()方法按照字典序的顺序来判断了。

代码如下:

Collections.sort(li , (a,b) -> {
    
    
     if(a.equals(b))
      return 0;
     if(a.length()>b.length()) {
    
    
      return 1;
     }else if(a.length()<b.length()) {
    
    
      return -1;
     }else {
    
    
      return a.compareTo(b);
     }
    });

我在这里用到了Lambada表达式,为了使代码变的更加简洁紧凑。a,b都是li集合里的对象值,不需要声明参数类型,编译器可以统一识别参数值,在{ }里的表达式返回值编译器也会自动返回。

总代码

public class Test {
    
    
 public static void main(String[] args) throws Exception {
    
    
 
  List<String> li = new ArrayList<String>();
  
  System.out.println("请输入数字:");
     BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
     
     int count = 0;
     String str = "";
     
     do {
    
    
      str = bf.readLine();
      if(str.length()==0) {
    
    
       count ++;
      }else if(str.matches("[0-9]+")) {
    
    
       count = 0;
       li.add(str);
      }else if(str.matches("[A-Za-z]+")) {
    
    
       count = 0;
       System.out.println("对不起只能输入数字");
      }else {
    
    
       count = 0;
       System.out.println("输出的内容:"+str);
      }
     }while(count != 2);

    Collections.sort(li , (a,b) -> {
    
    
     if(a.equals(b))
      return 0;
     if(a.length()>b.length()) {
    
    
      return 1;
     }else if(a.length()<b.length()) {
    
    
      return -1;
     }else {
    
    
      return a.compareTo(b);
     }
    });

    for(int i = 0; i< li.size(); i++) {
    
    
     System.out.println(li.get(i));}
    }
    
}

猜你喜欢

转载自blog.csdn.net/aljp123/article/details/108570953