zoukankan      html  css  js  c++  java
  • JavaSE编码试题强化练习7

    1.编写应用程序,创建类的对象,分别设置圆的半径、圆柱体的高,计算并分别显示圆半径、圆面积、圆周长,圆柱体的体积。
    /**
     * 圆类
     */
    public class Circle {
      /**
       * 类属性--圆半径
       */
      private double radius;
      /**
       * 构造方法
       */
      public Circle() {
      }
    
      public Circle(double radius) {
        this.radius = radius;
      }
      /**
       * 成员方法--计算圆的周长
       */
      double getPerimeter(){
        return 2*Math.PI*radius;
      }
      /**
       * 成员方法--计算圆的面积
       */
      protected double getArea(){
        return Math.PI*radius*radius;
      }
      /**
       * 成员方法--显示圆的半径,周长,面积
       */
      String show(){
        return "圆的半径 = "+radius+"
    "+"圆的周长 = "+getPerimeter()+"
    "+
          "圆的面积 " +
          "= "+getArea();
      }
    }
    /**
     * 圆柱体类--圆类的子类
     */
    public class Cylinder extends Circle {
      /**
       * 类属性--圆柱体的高
       */
      private double hight;
    
      /**
       * 构造方法
       */
      public Cylinder() {
      }
    
      public Cylinder(double hight) {
        this.hight = hight;
      }
    
      Cylinder(double r, double h) {
        super(r);
        this.hight = h;
      }
      /**
       * 成员方法--计算圆柱体的体积
       */
      private double getVolume(){
        return getArea()*hight;
      }
      /**
       * 成员方法--展示圆柱体高和体积
       */
      public String show(){
        return "圆柱体的高 = "+hight+"
    "+"圆柱体体积 = "+getVolume();
      }
    }
    /**
     * 测试类
     */
    public class Test {
      public static void main(String[] args) {
        /**
         * 创建圆、圆柱体对象,通过构造方法完成赋值
         */
        Circle c = new Circle(0.5);
        Cylinder cy = new Cylinder(0.8,5);
        /**
         * 调用方法
         */
        System.out.println(c.show());
        System.out.println(cy.show());
      }
    }

    运行结果:

     此处小结一下:

    Java中的四个权限访问修饰符及其访问范围

    1) 类的访问权限只有两种
      a) public(公共的) 可被同一项目中的所有的类访问。(必须与文件名同名)
      b) 默认 可被同一个包中的类访问。
    2) 成员(成员变量或成员方法)访问权限共有四种:
      a) public(公共的) 可以被项目中所有的类访问。
      b) protected(受保护的) 可以被这个类本身访问;同一包中的所有其他的类访问;被它的子类(同一包以及不同包中的子类)访问。
      c) 默认 被这个类本身访问;被同一个包中的类访问。
      d) private(私有的) 只能被这个类本身访问。
    用一张图表总结如下:
    权限修饰符 同一类中 同一包中不同类 不同包中子类 不同包中非子类
    public YES YES YES YES
    protected YES YES YES NO
    默认 YES YES NO NO
    private YES NO NO NO
    2.编写一个Worker类,为Worker类添加相应的代码,使得Worker对象能正确放入TreeSet中。并编写相应的测试代码。
    思路:
    1) Worker类含有name,age,salary三个属性
    2) 取值,赋值的方法、构造方法
    3) 先按工人的年龄大小比较,年龄小的排在前面;若年龄相同,则按字典顺序比较工人姓名
    4) 编写测试类,向集合中添加三条数据
    5) 遍历集合,输出集合中的元素信息(Worker类编写toString方法)
    /**
     * 工人类
     */
    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.name);
        }
      }
    }
    public class TestWorker {
      public static void main(String[] args) {
        /**
         * 创建集合对象完成信息添加
         */
        Set<Worker> set = new TreeSet<Worker>();
        set.add(new Worker("A",26,9959));
        set.add(new Worker("J",25,8848));
        set.add(new Worker("V",26,7868));
        set.add(new Worker("A",27,9527));
        /**
         * 遍历集合输出结果
         */
        Iterator<Worker> it = set.iterator();
        while (it.hasNext()){
          Worker w  = it.next();
          System.out.println(w.toString());
        }
      }
    }
    /**
     * 小结:Set集合类型
     * 1、特点:
     *    1)无序
     *    2)唯一(不允许重复元素)
     * 2、包括HashSet、LinkedHashSet、TreeSet
     *    1)HashSet
     *      ◆采用Hashtable(哈希表)存储结构(神奇的结构)
     *      ◆优点:添加、查找、删除速度快
     *      ◆缺点:无序
     *    2)LinkedHashSet
     *      ◆采用了哈希表存储结构,同时使用链表维护次序
     *      ◆特点:有序(添加顺序)
     *    3)TreeSet
     *      ◆采用二叉树(红黑树)的存储结构
     *      ◆优点:有序,查询速度比List快(按内容查找)
     *      ◆缺点:查询速度没有HashSet快
     * 3、总结:
     *    ◆HashSet 哈希表 唯一 无序
     *    ◆LinkedHashSet 哈希表+链表 唯一 有序(添加顺序)
     *    ◆TreeSet 红黑树 一种二叉平衡树 唯一 有序(自然顺序)
     *    ◆List针对Collection增加了一些关于索引位置操作的方法,get(i);add(i,elem);remove(i);set(i,elem)
     *    ◆Set是无序的,不可能提供关于索引位置操作的方法,set针对Collection没有增加任何方法
     *    ◆List遍历有三种方式:for循环;for-each循环;Iterator迭代器
     *    ◆Set的遍历方式有两种:for-each循环;Iterator迭代器
     * 注意:
     * 对于自定义类:
     *    ◆在HashSet和LinkedHashSet中要实现hasCode()和equals()方法;
     *    ◆在TreeSet中要实现Comparable接口并指定比较的规则。
     */

    运行结果:

    3.采用递归和非递归的方式对int数组进行折半查找。(与前面有重复,重复加深记忆,锻炼熟练度)
    肝!!!
    public class TestBinarySearch {
      public static void main(String[] args) {
        int[] arr = {22,23,33,34,55,56,66,67,78};
        int key1 = 22;
        int key2 = 55;
        int key3 = 78;
        int key4 = 88;
        int n1 = binarySearch(arr,key1);
        int n2 = binarySearch(arr,key2);
        int n3 = binarySearch(arr,key3);
        int n4 = binarySearch(arr,key4);
        System.out.println("非递归查找key1的索引号为:"+n1);
        System.out.println("非递归查找key2的索引号为:"+n2);
        System.out.println("非递归查找key3的索引号为:"+n3);
        System.out.println("非递归查找key4的索引号为:"+n4);
        System.out.println("==========================");
        int n5 = binarySearch(arr,key1);
        int n6 = binarySearch(arr,key2);
        int n7 = binarySearch(arr,key3);
        int n8 = binarySearch(arr,key4);
        System.out.println("递归查找key1的索引号为:"+n5);
        System.out.println("递归查找key2的索引号为:"+n6);
        System.out.println("递归查找key3的索引号为:"+n7);
        System.out.println("递归查找key4的索引号为:"+n8);
      }
      public static int binarySearch(int[] arr,int key){
        int start = 0;
        int end = arr.length - 1;
        while (start <= end){
          int mid = (start + end) / 2;
          int value = arr[mid];
          if (key == value){
            return mid;
          }else if (key > value){
            start = mid + 1;
          }else {
            end = mid - 1;
          }
        }
        return -1;
      }
      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) {
        int mid = (start + end) / 2;
        int value = arr[mid];
        while (start <= end){
          if (key > value){
            return recursionBinarySearch(arr,mid + 1,end,key);
          }else if (key < value){
            return recursionBinarySearch(arr,start,mid - 1,key);
          }else {
            return mid;
          }
        }
        return -1;
      }
    }

    运行结果:

  • 相关阅读:
    Spoj 2798 Qtree3
    [HAOI2015]树上操作
    Grass Planting
    [ZJOI2008] 树的统计Count
    Spoj375 Qtree--树链剖分
    [HNOI2012]永无乡
    雨天的尾巴
    temp
    线段树动态开点之逆序对
    线段树动态开点
  • 原文地址:https://www.cnblogs.com/sinoaccer/p/11965419.html
Copyright © 2011-2022 走看看