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;
  }
}

运行结果:

原文地址:https://www.cnblogs.com/sinoaccer/p/11963544.html

时间: 2024-10-11 11:37:23

JavaSE编码试题强化练习4的相关文章

JavaSE编码试题强化练习2

1.编写递归算法程序:一列数的规则如下: 0.1.1.2.3.5.8.13.21.34...... 求数列的第40位数是多少. public class TestRecursion { public static void main(String[] args) { /** * 调用fibo方法并输出结果 */ int n = 40; TestRecursion tr = new TestRecursion(); System.out.println(tr.fibo(n)); } /** * 定

JavaSE编码试题强化练习5

1.不使用函数实现字符串的翻转 /** * 1.不使用函数实现字符串的翻转 */ public class TestStringReverse { public static void main(String[] args) { String s1 = "FEDCBA"; System.out.println("翻转前:"+s1); /** * 此处需注意用s1接收方法的返回值,不然输出的还是没翻转之前的s1 */ s1 = reverseI(s1); System

JavaSE编码试题强化练习6

1.写出选择排序的代码实现,对一个int数组进行排序 public class TestSelectSort { public static void main(String[] args) { int [] arr = {87,65,5,5,43,21}; System.out.print("排序前:[ "); for (int i : arr){ System.out.print(i+" "); } System.out.println("]"

字符集与字符编码的强化理解与操作实践

字符集与字符编码的强化理解与操作实践 踩坑 最近在工作中遇到了一个说大不大说小不小的问题,就是当我解析一个xml文件的时候,抛出了一个"Invalid byte 2 of 2-byte UTF-8 sequence"的异常,这个异常会导致解析直接退出,显然不能容忍.查阅相关资料稍微定位了一下,大概知道是字符集的问题,仔细一看,xml文件中的确有中文字符,而且当我把这些中文字符删了之后的确又能解析成功.不过我还是不能理解这当中的缘由,不过由于时间原因,当时只是把中文字符删了就草草完工.现

JavaSE 面试题: 方法的参数传递机制

JavaSE 面试题 方法的参数传递机制 import java.util.Arrays; public class Test { public static void main(String[] args) { int i = 1; String str = "hello"; Integer num = 200; int[] arr = {1, 2, 3, 4, 5}; MyData my = new MyData(); change(i, str, num, arr, my); S

JavaSE 笔试题: 自增变量

JavaSE 笔试题 自增变量 public class Test { public static void main(String[] args) { int i = 1; i = i++; int j = i++; int k = i + ++i * i++; System.out.println("i=" + i); System.out.println("j=" + j); System.out.println("k=" + k); }

javaSE面试题总结

目 录 第一章 初识Java 1 1. Java跨平台原理(字节码文件.虚拟机) 1 2. Java的安全性 1 3. Java三大版本 2 4. Java开发运行过程 2 5. Java开发环境配置 2 6. 什么是JVM?什么是JDK? 什么是JRE? 2 7. Java三种注释类型 3 第二章 数据类型和运算符 4 1. 8种基本数据类型及其字节数 4 2. i++和++i的异同之处 4 3. &和&&的区别和联系,|和||的区别和联系 5 4. 用最有效率的方法算出2乘以8

JAVASE面试题

1.抽象类和接口的区别 抽象类重在对象的本质,接口则是对象的附加行为 抽象类是按需实现 ,接口必须全部实现 一个类只能继承一个抽象类 ,但是能多实现接口 抽象类中能定义普通的方法 ,接口中不能定义普通的方法 应用的场景 : 抽象类: 在设计类时,如果有些方法我们能确定,而有些方法不能确定,这时候我们就可以把该类声明成抽象类 接口: 我们在定义相互调用规则时,可以使用接口.面向接口进行编程的明显好处,就是能极大降低软件系统的相互耦合性,接口的定义者按照接口进行调用,而实现者去实现接口 2.list

C++强化学习规划表

第一阶段 C语言加强以及C++语言详解(29天) 课程名称 课程内容 学习目标 C语言强化 · C语言基础复习(数据类型.变量.内存布局.指针基础) · C语言基础强化提高(C语言中的字符串.一维数组.二维数组) · C语言基础强化提高(一级指针,二级指针,三级指针实战,N级指针概念,指针数组和数组指针) · C语言基础强化提高(结构体.文件的使用) · 动态库的封装和设计 · 函数指针回调函数 · C语言面试题强化与提高 在基础班C语言知识点之上,掌握C语言深入技巧,为日后 做更大的项目打下坚