Day19(可变参数,增强for循环遍历,泛型通配符<?>,TreeSet,LinkedHashSet,集合的嵌套遍历,Set集合,静态导入,)

一、可变参数

package com.shujia.lhw.day19;

import java.util.Arrays;
import java.util.List;

/*
    可变参数概述:
      定义方法的时候不知道该定义多少个参数
    格式:
      修饰符 返回值类型 方法名(数据类型... 变量名){}
    注意:
      这里的变量其实是一个数组
      如果一个方法有可变参数,并且有多个参数,那么,可变参数肯定是最后一个

    Arrays工具类中的一个方法
      public static <T> List <T> asList(T... a)
 */
public class ArgsDemo {
    public static void main(String[] args) {
        //使用方法求两个数之和
        int a = 10;
        int b = 20;
        sum(a, b);

        //使用方法求三个数之和
        int c = 30;
        sum(a, b, c);

        //使用方法求四个数之和
        int d = 40;
        sum(a, b, c, d);

        sum("明旺", 90, 92, 93);

//        sum(1,2,3,4,5,6,7,8,9);

        //数组--->List(ArrayList)集合
        List<String> strings = Arrays.asList("hello", "world", "java", "bigdata");
        for (String s : strings) {
            System.out.println(s);
        }
    }
    //同一个方法定义中,可变参数只能出现一次
    //public static void sum(int... ints1,int... ints2){
    //}

    //当使用可变参数定义方法的时候,有其他数据类型参与的时候,将可变参数的定义放在最后
    public static void sum(String name,int... ints){
        int sum = 0;
        for (int i : ints) {
            sum +=i;
        }
        System.out.println(name+"学生的总成绩为:"+sum);
    }

    //使用可变参数的形式定义加法的方法
    //注意可便参数的变量最终是一个数组的变量名
    //这里将来传入多个参数的时候,内部会自动将这么多个参数形成一个数组,数组名就是我们定义的ints
    public static void sum(int... ints){
        int sum = 0;
        for(int i :ints){
            sum += i;
        }
        System.out.println(ints.length+"个数之和为:"+sum);
    }

//    public static void sum(int a,int b,int c,int d){
//        System.out.println("四个数之和为:"+(a+b+c+d));
//    }
//    public static void sum(int a,int b, int c){
//        System.out.println("三个数之和为:"+(a+b+c));
//    }
//    public static void sum(int a,int b){
//        System.out.println("两个数之和为:"+(a+b));
//    }
}

----------------------------------------------------------------------------------------------------------------------------

二、增强for循环遍历

package com.shujia.lhw.day19;

import java.util.ArrayList;
import java.util.ListIterator;

/*
    JDK1.5之后出现的新特性:
      到目前为止,学过哪些知识是JDK1.5之后出现的?
        泛型,增强for,包装类,Scanner,枚举

      增强for循环概述:简化数组和Collection集合的遍历

      语句定义格式:
        for(元素数据类型 变量名 (自定义) :数组或者Collection集合){
           使用变量即可,该变量就是元素
        }
      好处:简化遍历
 */
public class ForDemo {
    public static void main(String[] args) {
        //定义一个数组
        int[] arr = {1, 2, 3, 4, 5};

        //普通for循环遍历
        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]);
        }
        System.out.println("使用增强for循环遍历数组:");
        for (int i : arr) {
            System.out.println(i);

        }
        System.out.println("===========================================");
        ArrayList<String> strings = new ArrayList<>();
        strings.add("hello");
        strings.add("world");
        strings.add("java");
        strings.add("bigdata");
        strings.add("hadoop");

        for (String string : strings) {
            System.out.println(string);
        }
//        strings = null;
//        for (String string : strings) {//NullPointerException
//            System.out.println(string);
//        }
        //我们应该在遍历之前判断一下是不是null
//        if(strings!=null){
//            for(String string:strings){
//                System.out.println(string);
//            }
//        }else{
//            System.out.println("该集合为:null");
//        }
        //其实增强for循环就是用来替代迭代器的
        //怎么去验证它就是来替代迭代器的呢?
        //使用并发修改异常验证
//        for (String s : strings) {
//            //ConcurrentModificationException
//            if ("java".equals(s)) {
//                strings.add("spark");
//            }
//        }
        ListIterator<String> iterator = strings.listIterator();
        while (iterator.hasNext()){
            String next = iterator.next();
            if("java".equals(next)){
                iterator.add("spark");
            }
        }
        System.out.println(strings);

    }
}

---------------------------------------------------------------------------------------------------------------------------

三、泛型通配符<?>

package com.shujia.lhw.day19;

import java.util.ArrayList;

/*
    泛型通配符<?>
        任意类型,如果没有明确,那么就是Object以及任意的Java类了
       ? extends E
         向下限定,E及其子类
       ? super E
         向上限定,E及其父类

 */
public class GenericDemo1 {
    public static void main(String[] args) {
        ArrayList<Animal> list1 = new ArrayList<Animal> ();
        ArrayList<Dog> list2 = new ArrayList<Dog>();
        ArrayList<Object> list3 = new ArrayList<Object>();

        //泛型通配符<?>
        //任意类型,如果没有明确,那么就是Object以及任意的java类了
        ArrayList<?> list4 = new ArrayList<Animal>();
        ArrayList<?> list5 = new ArrayList<Dog>();
        ArrayList<?> list6 = new ArrayList<Object>();

        //? Extends E 向下限定,E及其子类
        ArrayList<? extends Animal> list7 = new ArrayList<Animal>();
        ArrayList<? extends Animal> list8 = new ArrayList<Dog>();
        ArrayList<? extends Animal> list9 = new ArrayList<Cat>();
//        ArrayList<? extends Animal> list10 = new ArrayList<Object>();

        //? super E 向上限定,E及其父类
        ArrayList<? super Animal> list11 = new ArrayList<Animal>();
        ArrayList<? super Animal> list12 = new ArrayList<Object>();
//        ArrayList<? super Animal> list13 = new ArrayList<Dog>();

    }
}

------------------------------------------------------------------------------------------------------------------------

四、GenericTest1

package com.shujia.lhw.day19;

/*
    泛型类的测试
 */
public class GenericTest1 {
    public static void main(String[] args) {
        //如果不加泛型,默认使Object类型
//        GenericTool1 gt1 = new GenericTool1();
//        gt1.setObj("hello");
//        gt1.setObj(20);
//        gt1.setObj(12.34);

        GenericTool1<String> gt2 = new GenericTool1<>();
        gt2.setObj("hello");
//        gt2.setObj(20);

        String obj = gt2.getObj();


    }
}

------------------------------------------------------------------------------------------------------------------------

五、GenericTest2

package com.shujia.lhw.day19;

public class GenericTest2 {
    public static void main(String[] args) {
        GenericTool2 genericTool2 = new GenericTool2();
        genericTool2.show("hello");
        genericTool2.show(10);
        genericTool2.show(12.34);
    }
}

------------------------------------------------------------------------------------------------------------------------------

六、泛型接口的测试

package com.shujia.lhw.day19;
/*
    泛型接口的测试
 */
public class GenericTest3 {
    public static void main(String[] args) {
        GenericTool3lmpl<String> stringGenericTool3 = new GenericTool3lmpl<>();
        stringGenericTool3.show("hello");
//        stringGenericTool3.show(20);
    }
}

---------------------------------------------------------------------------------------------------------------------------------

七、泛型类

package com.shujia.lhw.day19;
/*
    泛型类
      把泛型定义在类上
      格式:public class 类名<泛型类型1,...>
      注意:泛型类型必须是引用类型
      这里的<>里面的内容仅仅表示的是一种参数数据类型,参数类型是一种变量
      既然是一种变量,就要符合变量的命名规则,可以使任意符合标识符起名字规则的名字

      一般情况下,在定义的时候,习惯用一个大写字母表示
 */
public class GenericTool1<T> {
    private T obj;

    public T getObj(){
        return obj;
    }
    public void setObj(T obj){
        this.obj = obj;
    }

}

---------------------------------------------------------------------------------------------------------------------------------

八、泛型方法

package com.shujia.lhw.day19;
/*
    泛型方法
      把泛型定义在方法上
      格式:public <泛型类型> 返回类型 方法名(泛型类型)
 */
public class GenericTool2 {
    public void show(String s){
        System.out.println(s);
    }
    public void show(int i){
        System.out.println(i);
    }
    public void show(double d){
        System.out.println(d);
    }

    //用泛型方法改进,将来不确定要传入什么类型的数据
    public <F> void show(F f){
        System.out.println(f);
    }
}

---------------------------------------------------------------------------------------------------------------------------------

九、泛型接口

package com.shujia.lhw.day19;
/*
    泛型接口
      把泛型定义在接口上
      格式:public interface 接口名<泛型类型1...>
 */
public interface GenericTool3<W> {
    public void show(W w);
}

---------------------------------------------------------------------------------------------------------------------------------

十、

package com.shujia.lhw.day19;

public class GenericTool3lmpl<W> implements GenericTool3<W>{
    @Override
    public void show(W w){
        System.out.println(w);
    }
}

------------------------------------------------------------------------------------------------------------------------------

十一、LinkedHashSet

package com.shujia.lhw.day19;

import java.util.LinkedHashSet;

/*
    public class HashSet<E> implements Set<E>
    public class LinkedHashSet<E> extends HashSet<E> implements Set<E>

    LinkedHashSet:
      1、底层数据结构是哈希表和链表
      2、哈希表保证元素的唯一
      3、链表保证了元素的有序(存储和取出的顺序一致)
      4、线程不安全,效率高
 */
public class LinkedHashSetDemo {
    public static void main(String[] args) {
        LinkedHashSet<String> set1 = new LinkedHashSet<>();

        //添加元素到集合
        set1.add("hello");
        set1.add("world");
        set1.add("java");
        set1.add("bigdata");
        set1.add("hadoop");
        set1.add("world");
        set1.add("java");
        set1.add("hello");
        set1.add("spark");
        set1.add("spark");
        set1.add("hbase");
        set1.add("flink");
        set1.add("java");
        set1.add("hello");

        //遍历
        for(String s : set1){
            System.out.println(s);
        }
    }
}

---------------------------------------------------------------------------------------------------------------------------

十二、集合的嵌套遍历

package com.shujia.lhw.day19;

import java.util.ArrayList;
import java.util.Iterator;

/*
    集合的嵌套遍历
    需求:目前,数加学院有十五期,十六期。每一期都有很多学生,每个学生都是一个学生对象,可以用一个集合表示一个班的
    学生
    十五期的学生:ArrayList<Student> classList15;
    十六期的学生:ArrayList<Student> classList16;
    无论是十五期还是十六期,都属于数加学院的班级
    数加学院本身也可以通过集合表示:ArrayList<ArrayList<Student>> shujia;

    这样的现象叫做集合嵌套。
 */
public class ListQianTaoTest {
    public static void main(String[] args) {
        //定义一个十五期的班级集合
        ArrayList<Student> classList15 = new ArrayList<> ();
        //定义一个十六期的班级集合
        ArrayList<Student> classList16 = new ArrayList<> ();
        //定义一个数加学院的集合
        ArrayList<ArrayList<Student>> shujia = new ArrayList<>();

        //将十五期和十六期添加到shujia集合中
        shujia.add(classList15);
        shujia.add(classList16);

        //创建十五期的学生对象
        Student s1 = new Student("明旺",18);
        Student s2 = new Student("王宇",17);
        Student s3 = new Student("周家祥",16);
        Student s4 = new Student("张保桂",20);

        //创建十六期的学生对象
        Student s11 = new Student("小王",18);
        Student s12 = new Student("小李",17);
        Student s13 = new Student("小刘",19);
        Student s14 = new Student("小杨",16);

        //将十五期的学生对象添加到十五期集合中
        classList15.add(s1);
        classList15.add(s2);
        classList15.add(s3);
        classList15.add(s4);

        //将十六期的学生对象添加到十六期集合中
        classList16.add(s11);
        classList16.add(s12);
        classList16.add(s13);
        classList16.add(s14);

        //遍历
        //增强for循环遍历
//        for(ArrayList<Student> clazz : shujia){
//            for (Student s : clazz){
//                System.out.println(s);
//            }
//        }
        //普通for循环遍历
        for(int i = 0;i<shujia.size();i++){
            if(i==0){
                System.out.println("============十五期:===============");
                for (int j = 0;j<shujia.get(i).size();j++){
                    Student student = shujia.get(i).get(j);
                    System.out.println(student);
                }
            }
        }
        System.out.println("=======================================================");

        //迭代器遍历
        Iterator<ArrayList<Student>> iterator = shujia.iterator();
        while (iterator.hasNext()){
            ArrayList<Student> clazz = iterator.next();
            Iterator<Student> iterator1 = clazz.iterator();
            while (iterator1.hasNext()){
                Student student = iterator1.next();
                System.out.println(student);
            }
        }
    }
}
package com.shujia.lhw.day19;

public class Student {
    private String name;
    private int age;

    public Student() {
    }

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

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

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

------------------------------------------------------------------------------------------------------------------------

十三、ListTest

package com.shujia.lhw.day19;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Scanner;

/*
    键盘录入多个数据,以0结束,要求在控制台输出这多个数据中的最大值

    1、由于不知道输入多少次所以用while循环进行输入
    2、用集合存储数据
    3、toArray()
    4、Arrays.sort()
    5、取最后一个元素就是最大值
 */
public class ListTest {
    public static void main(String[] args) {
        //键盘录入对象
        Scanner sc = new Scanner(System.in);
        //创建集合对象
        ArrayList<Integer> list = new ArrayList<>();

        boolean flag = true;

        while (flag==true){
            int number = sc.nextInt();
            if (number==0){
                flag=false;
                System.out.println("数据录入完毕");
            }else{
                list.add(number);
            }
        }
        //将集合转换成数组
        Object[] objects = list.toArray();

        Arrays.sort(objects);
        System.out.println("最大值为:"+objects[objects.length-1]);
    }
}

-------------------------------------------------------------------------------------------------------------------------------

十四、RandomTest

package com.shujia.lhw.day19;

import java.util.ArrayList;
import java.util.Random;

/*
    获取10个1-20之间的随机数,要求不能重复
    1、由于我们不确定获取随机数的次数,长度不好确定,所以我们选择集合
    2、随机数生成的方式:Random类:nextInt(int num):左闭右开
 */
public class RandomTest {
    public static void main(String[] args) {
        //1、创建随机数对象
        Random random = new Random();
        //2、创建集合对象存储随机数
        ArrayList<Integer> list = new ArrayList<>();

//        System.out.println(random.nextInt(20));
//        int number = random.nextInt(20) + 1;
//        System.out.println(number);

        //定义一个变量统计集合中是否有10个元素
        int count = 0;

        while(count<10){
            //生成随机数
            int number = random.nextInt(20) + 1;
            //判断集合中是否包含这个随机数
            if (!list.contains(number)){
                list.add(number);
                count++;
            }
        }
        System.out.println(list);
    }
}

--------------------------------------------------------------------------------------------------------------------------------

十五、Set集合

package com.shujia.lhw.day19;

import java.util.HashSet;
import java.util.Set;

/*
    Set集合:元素是唯一的,并且元素的顺序是无序的集合

    在Set集合中存储的元素为什么不会有重复的呢?
 */
public class SetDemo1 {
    public static void main(String[] args) {
        Set<String> set1 = new HashSet<>();

        //向集合中添加元素
        set1.add("hello");
        set1.add("world");
        set1.add("java");
        set1.add("bigdata");
        set1.add("hadoop");
        set1.add("world");
        set1.add("java");
        set1.add("hello");
        set1.add("spark");
        set1.add("spark");
        set1.add("hbase");
        set1.add("flink");
        set1.add("java");
        set1.add("hello");

        //遍历
        for(String s : set1){
            System.out.println(s);
        }
    }
}

---------------------------------------------------------------------------------------------------------------------------------

package com.shujia.lhw.day19;

import java.util.HashSet;
import java.util.Set;

/*
    用Set集合存储学生对象(当学生的姓名和年龄都一样的时候,判定是同一个学生)
 */
public class SetDemo2 {
    public static void main(String[] args) {
        //创建集合对象
        Set<Student2> student2s = new HashSet<>();

        //创建学生对象
        Student2 s1 = new Student2("明旺",18);
        Student2 s2 = new Student2("王宇",17);
        Student2 s3 = new Student2("周家祥",16);
        Student2 s4 = new Student2("明旺",18);

        //将学生对象添加到集合中
        student2s.add(s1);
        student2s.add(s2);
        student2s.add(s3);
        student2s.add(s4);

        //遍历
        for (Student2 student2 : student2s) {
            System.out.println(student2);
            
        }
    }
}
package com.shujia.lhw.day19;

import java.util.Objects;

public class Student2 {
    private String name;
    private int age;

    public Student2() {
    }

    public Student2(String name, int age) {
        this.name = name;
        this.age = age;
    }

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

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Student2 student2 = (Student2) o;
        return age == student2.age && Objects.equals(name, student2.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, age);
    }

    @Override
    public String toString() {
        return "Student2{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

-------------------------------------------------------------------------------------------------------------------------------- 

 十六、静态导入

package com.shujia.lhw.day19;

import static com.shujia.lhw.day19.StaticClass.fun;
import static com.shujia.lhw.day19.StaticClass.show;
import static java.lang.Math.abs;
import static java.lang.Math.pow;

/*
    静态导入:
      语句定义格式:import static 包名...类名.方法名;
      可以直接导入到方法级别

    注意事项:
      1、方法必须是静态的
 */
public class StaticImportDemo {
    public static void main(String[] args) {
        //Math
        System.out.println(abs(-100));
        System.out.println(pow(2,3));
        System.out.println(Math.max(100,200));

        //有没有什么方法,不用写类名,直接写方法名?
//        System.out.println(abs(-200));

        //这时候就需要静态导入的技术
        System.out.println(abs(-200));
        System.out.println(pow(2,4));
        fun();
        //当静态导入的方法名与本类中的方法名冲突的时候,调用的是本类中的方法
        show("spark");

        //如果此时我们想使用静态导入的方法,怎么办呢?
//        StaticClass.show("flink");
        //将前缀路径写完整
        com.shujia.lhw.day19.StaticClass.show("flink");
        //当静态导入的方法名与本类中的方法名冲突的时候,我们发现,直接通过类名调用的方式会更加简单
        //所以根据实际情况,选择使用静态导入
    }
    public static void show(String s){
        System.out.println("这是在StaticImportDemo类中的show方法"+s);
    }
}
package com.shujia.lhw.day19;

public class StaticClass {
    public static void fun(){
        System.out.println("数加科技,yyds");
    }

    public static void show(String s){
        System.out.println(s);
    }
}

------------------------------------------------------------------------------------------------------------------------------

十七、TreeSet

package com.shujia.lhw.day19;

import java.util.TreeSet;

/*
    TreeSet:元素唯一,元素可以按照某种规则进行排序
    两种排序方式:
      自然排序
      比较器排序

    A NavigableSet实现基于TreeMap的原件的使用其有序natural ordering或由Comparetor集合创建时提供
    这取决于所用的构造方法

    为什么会进行去重以及排序呢?怎么排序呢?看源码


 */
public class TreeSetDemo1 {
    public static void main(String[] args) {
        //创建TreeSet平台
        TreeSet<Integer> treeSet = new TreeSet<>();
        treeSet.add(20);
        treeSet.add(18);
        treeSet.add(24);
        treeSet.add(23);
        treeSet.add(88);
        treeSet.add(16);
        treeSet.add(12);
        treeSet.add(18);
        treeSet.add(20);
        treeSet.add(23);
        treeSet.add(1);
        treeSet.add(2);

        //遍历
        for (Integer i : treeSet) {
            System.out.println(i);
        }
//        String s1 = "hello";
//        String s2 = "hello";
//        System.out.println(s1.compareTo(s2));
    }
}

--------------------------------------------------------------------------------------------------------------------------------

十八、TreeSetDemo2

package com.shujia.lhw.day19;

import java.util.TreeSet;

/*
    存储学生对象并遍历

    按照正常的写法我们一运行就报错
    java.lang.ClassCastException:类转换异常
    由于我们这里TreeSet创建的时候,使用的是无参构造方法,走的是自然排序
    而这里底层源码中有一步是向下转型的
    Comparable<? super K> k = (Comparable<?super K>)key;报错了
    原因是我们Student3没有实现Comparable接口,无法进行向下转型,所以报错了。
 */
public class TreeSetDemo2 {
    public static void main(String[] args) {
        //创建TreeSet集合
        TreeSet<Student3> set = new TreeSet<>();

        //创建学生对象
        Student3 s1 = new Student3("theshy",20);
        Student3 s2 = new Student3("xiaohu",24);
        Student3 s3 = new Student3("uzi",25);
        Student3 s4 = new Student3("kasa",22);
        Student3 s5 = new Student3("rookie",23);
        Student3 s6 = new Student3("zitai",21);
        Student3 s7 = new Student3("faker",25);
        Student3 s8 = new Student3("xiaohu",24);

        //将学生对象添加到集合中
        set.add(s1);
        set.add(s2);
        set.add(s3);
        set.add(s4);
        set.add(s5);
        set.add(s6);
        set.add(s7);
        set.add(s8);

        for (Student3 student3 : set) {
            System.out.println(student3);
        }
    }
}
package com.shujia.lhw.day19;

public class Student3 implements Comparable<Student3>{
    private String name;
    private int age;

    public Student3() {
    }

    public Student3(String name, int age) {
        this.name = name;
        this.age = age;
    }

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

    @Override
    public String toString() {
        return "Student3{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    @Override
    public int compareTo(Student3 o){
//        return 0;
//        return 1;
//        return -1;
        //这里返回什么应该根据我们自己定义的规则来排序
        //比如我想在去重的前提下,按照年龄进行排序
//        return this.age - o.age;

        //年龄不一样,姓名不一定一样
        //这里要区分主次条件(主要条件是业务明确给出的,次要条件是我们自己分析得出的)
        int i = this.age - o.age;
        //判断姓名是否一样(三目运算符)
        int i2 = i == 0?this.name.compareTo(o.name): i;
        return i2;
    }
}

-----------------------------------------------------------------------------------------------------------------------------

十九、TreeSetDemo3

package com.shujia.lhw.day19;

import java.util.TreeSet;

/*
    需求:TreeSet集合存储学生对象,并且以姓名的长度来排序
 */
public class TreeSetDemo3 {
    public static void main(String[] args) {
        //创建TreeSet集合对象
        TreeSet<Student4> set = new TreeSet<>();

        //创建学生对象
        Student4 s1 = new Student4("mingwang",18);
        Student4 s2 = new Student4("wangyu",19);
        Student4 s3 = new Student4("zhoujiaxiang",17);
        Student4 s4 = new Student4("zhangbaogui",18);
        Student4 s5 = new Student4("liuzhicheng",18);
        Student4 s6 = new Student4("wangyu",20);

        //将学生对象添加到集合中
        set.add(s1);
        set.add(s2);
        set.add(s3);
        set.add(s4);
        set.add(s5);
        set.add(s6);

        for (Student4 student4 : set) {
            System.out.println(student4);
        }
    }
}
package com.shujia.lhw.day19;

public class Student4 implements Comparable<Student4>{
    private String name;
    private int age;

    public Student4() {
    }

    public Student4(String name, int age) {
        this.name = name;
        this.age = age;
    }

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

    @Override
    public String toString() {
        return "Student4{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    @Override
    public int compareTo(Student4 o) {
//        return 0;
        //主要条件:姓名的长度排序
        int i = this.name.length() - o.name.length();
//        return i;
        //长度一样,姓名内容不一定一样
        int i2 = i == 0 ? this.name.compareTo(o.name) : i;
        //姓名内容一样,年龄的大小不一定一样
        int i3 = i2 == 0 ? this.age - o.age : i2;
        return i3;
    }
}

--------------------------------------------------------------------------------------------------------------------------

二十、TreeSetDemo4 比较器排序

package com.shujia.lhw.day19;

import java.util.Comparator;
import java.util.TreeSet;

/*
    比较器排序
    利用TreeSet创建对象时的带参数的构造方法来进行比较器排序
    TreeSet(Comparator<? super E> comparator)
    构造一个新的,空的树集,根据指定的比较器进行排序
 */
public class TreeSetDemo4 {
    public static void main(String[] args) {
//        MyComparator mc = new MyComparator();
//        TreeSet<Student5> set = new TreeSet<>(mc);
        //匿名内部类实现Comparator接口
        TreeSet<Student5> set = new TreeSet<>(new Comparator<Student5>(){   
            @Override
            public int compare(Student5 o1, Student5 o2) {
//                return 0;
                //主要条件:姓名的长度排序
                int i = o1.getName().length() - o2.getName().length();
//                return i;
                //长度一样,姓名内容不一定一样
                int i2 = i == 0 ? o1.getName().compareTo(o2.getName()) : i;
                //姓名内容一样,年龄的大小不一定一样
                int i3 = i2 ==0 ? o1.getAge() - o2.getAge() : i2;

                return i3;
            }
        });

        //创建学生对象
        Student5 s1 = new Student5("mingwnag",18);
        Student5 s2 = new Student5("wangyu",19);
        Student5 s3 = new Student5("zhoujiaxiang",17);
        Student5 s4 = new Student5("zhangbaogui",18);
        Student5 s5 = new Student5("liuzhicheng",18);
        Student5 s6 = new Student5("wangyu",20);

        //将学生对象添加到集合中
        set.add(s1);
        set.add(s2);
        set.add(s3);
        set.add(s4);
        set.add(s5);
        set.add(s6);

        //遍历
        for (Student5 student5 : set) {
            System.out.println(student5);
        }
    }
}
package com.shujia.lhw.day19;

public class Student5 {
    private String name;
    private int age;

    public Student5() {
    }

    public Student5(String name, int age) {
        this.name = name;
        this.age = age;
    }

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

    @Override
    public String toString() {
        return "Student5{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
package com.shujia.lhw.day19;

import java.util.Comparator;

public class MyComparator implements Comparator<Student5> {
    @Override
    public int compare(Student5 o1,Student5 o2){
        //return 0;
        //主要条件:姓名的长度排序
        int i = o1.getName().length() - o2.getName().length();
//        return i;
        //长度一样,姓名内容不一定一样
        int i2 = i == 0 ? o1.getName().compareTo(o2.getName()):i;
        //姓名的内容一样,年龄的大小不一定一样
        int i3 = i2 == 0 ? o1.getAge() - o2.getAge() : i2;

        return i3;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

刘浩浩yyds

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值