• JavaSE编码试题强化练习4


    1.编写一个Worker类,为Worker类添加相应的代码,使得Worker对象能正确放入TreeSet中。并编写相应的测试代码。
    /**
     * Worker类
     */
    public class Worker implements Comparable<Worker>{
      /**
       * 私有属性
       */
      private String name;
      private int age;
      private double salary;
      /**
       * 构造方法
       */
      public Worker() {
      }
    
      public Worker(String name, int age, double salary) {
        this.name = name;
        this.age = age;
        this.salary = salary;
      }
      /**
       * getter setter方法
       */
      public String getName() {
        return name;
      }
    
      public void setName(String name) {
        this.name = name;
      }
    
      public int getAge() {
        return age;
      }
    
      public void setAge(int age) {
        this.age = age;
      }
    
      public double getSalary() {
        return salary;
      }
    
      public void setSalary(double salary) {
        this.salary = salary;
      }
    
      /**
       * 重写toString方法
       */
     public String toString(){
        return "工人信息 : { "+"姓名 = "+name+","+"年龄 = "+age+","+"薪水 = "+salary+" }";
     }
    
      /**
       * 重写compareTo方法:按年龄从小到大排序,年龄相同按名字的字典顺序排列
       */
      @Override
      public int compareTo(Worker other) {
        if (this.age != other.age){
          return this.age - other.age;
        }else {
          return this.name.compareTo(other.getName());
        }
      }
    }
    /**
     * 测试类
     */
    public class TestWorker {
      public static void main(String[] args) {
        /**
         * 创建Worker对象,通过构造方法完成赋值
         */
        Worker w1 = new Worker("F",27,5500);
        Worker w2 = new Worker("E",28,6500);
        Worker w3 = new Worker("B",26,5800);
        Worker w4 = new Worker("A",26,5300);
        /**
         * 创建TreeSet集合存放工人数据信息
         */
        Set<Worker> set = new TreeSet<Worker>();
        set.add(w1);
        set.add(w2);
        set.add(w3);
        set.add(w4);
        /**
         * 遍历Set,输出结果
         */
        for(Worker w : set){
          System.out.println(w);
        }
      }
    }

    运行结果:

     2.设计一个多线程的程序如下:设计一个火车售票模拟程序。假如火车站要有100张火车票要卖出,现在有10个售票窗口同时售票,用10个线程模拟这10个售票窗口的售票情况。

    /**
     * 定义售票类实现Runnable接口
     */
    public class SaleTicket implements Runnable {
      /**
       * 定义初始变量
       * total--总票数
       * count--票号(从0开始)
       */
      public int total = 100;
      public int count = 0;
    
      /**
       * 重写run()方法
       */
      @Override
      public void run() {
        while (total > 0){
          synchronized (this){
            if (total > 0){
              try {
                Thread.sleep(20);
              } catch (InterruptedException e) {
                e.printStackTrace();
              }
              /**
               * 票号++
               * 总票数--
               */
              count++;
              total--;
              System.out.println(Thread.currentThread().getName()+"售出票号为:"+count+
                " 的票"+"当前余票为:"+total);
            }
          }
        }
      }
    }
    /**
     * 测试类
     */
    public class TestSaleTicket {
      public static void main(String[] args) {
        /**
         * 创建线程对象,启动线程
         */
        SaleTicket st = new SaleTicket();
        /**
         * 使用循环创建启动线程
         */
        for (int i = 1;i <= 5;i++){
          Thread t = new Thread(st,i+"号售票窗口");
          t.start();
        }
        /**
         * 也可以手动创建5个线程并启动,代码稍显复杂
         */
        SaleTicket st1 = new SaleTicket();
        Thread t1 = new Thread(st1);
        Thread t2 = new Thread(st1);
        Thread t3 = new Thread(st1);
        Thread t4 = new Thread(st1);
        Thread t5 = new Thread(st1);
        t1.setName("窗口6");
        t2.setName("窗口7");
        t3.setName("窗口8");
        t4.setName("窗口9");
        t5.setName("窗口10");
        t1.start();
        t2.start();
        t3.start();
        t4.start();
        t5.start();
      }
    }

    运行结果:

     **各线程随机执行售票功能

    3.对一个数组进行折半查找,使用递归和非递归实现。

    /**
     * 递归实现数组的折半查找
     */
    public class TestRecursionBinarySearch {
      public static void main(String[] args) {
        int[] array = {1,2,3,4,5,6,7};
        int key = 1;
        int index = recursionBinarySearch(array,key);
        System.out.println(key+"的索引是"+index);
      }
      public static int recursionBinarySearch(int[] arr,int key){
        int start = 0;
        int end = arr.length - 1;
        return recursionBinarySearch(arr,start,end,key);
      }
    
      private static int recursionBinarySearch(int[] arr, int start, int end, int key) {
        /**
         * 递归的结束条件
         */
        if (start > end){
          return -1;
        }
        /**
         * 计算中间索引并获得其值
         */
        int mid = (start + end) / 2;
        int value = arr[mid];
        /**
         * 进行比较查询
         */
        if (key > value){
          start = mid + 1;
          return recursionBinarySearch(arr,start,end,key);
        }else if (key < value){
          end = mid - 1;
          return recursionBinarySearch(arr,start,end,key);
        }else {
          return mid;
        }
      }
    }

    运行结果:

    /**
     * 非递归实现数组的折半查找
     */
    public class TestBinarySearch {
      public static void main(String[] args) {
        int[] array = {1,2,3,4,5,6,7};
        int key = 7;
        int index = binarySearch(array,key);
        System.out.println(key+"的索引是"+index);
      }
      public static int binarySearch(int[] arr,int key){
        /**
         * 定义起始位置和结束位置索引号,第一次查找从两头开始(即start和end)
         */
        int start = 0;
        int end = arr.length - 1;
        //System.out.println("-1 代表要查的元素不在此数组中");
        while (start <= end){
          /**
           * 计算中间索引号,得到对应元素值
           */
          int mid = (start + end) / 2;
          int value = arr[mid];
          /**
           * 将要查找的元素key值和中间元素比较
           */
          if (key == value){
            return mid;
          }else if (key < value){
            end = mid - 1;
          }else {
            start = mid + 1;
          }
        }
        return -1;
      }
    }

    运行结果:

  • 相关阅读:
    新人手册
    使用koa-mysql-session时报错
    自建windows服务器如何部署egg应用
    mac os 10.15 virtualBox6.0.12崩溃
    thinkphp3.2 上传图片兼容小程序
    PHP版本微信支付开发
    php mysql 按照指定年月查找数据 数据库create_time为时间戳
    Mac OS 查看端口和杀死进程
    MAC PHP7 如何disable xdebug
    TCP为什么是三次握手,为什么不是两次或者四次 && TCP四次挥手
  • 原文地址:https://www.cnblogs.com/sinoaccer/p/11963544.html
Copyright © 2020-2023  润新知