栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

TreeSet对String类型等是可排序的,对于自定义的类型来说,TreeSet无法进行自动排序

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

TreeSet对String类型等是可排序的,对于自定义的类型来说,TreeSet无法进行自动排序

TreeSet对String类型等是可排序的;
1.TreeSet集合底层实际上是一个TreeMap
2.TreeMap集合底层是一个二叉树
3.放到Treeset集合中的元素,等同于放到TreeMap集合Key部分
4.TreeSet集合中的元素:无序不可重复,但是可以按照元素的大小顺序自动排序,称为:可排序集合

package Mapiiiiii;

import java.util.TreeSet;
public class TreeSetStringtest {
    public static void main(String[] args) {
        TreeSet treeSet=new TreeSet();
        treeSet.add("ab");
        treeSet.add("vrt");
        treeSet.add("cft");
        treeSet.add("bvf");
        treeSet.add("abc");
        treeSet.add("abd");
        for(String str:treeSet){
            System.out.println(str);
        }
        System.out.println("============");
        TreeSet tree=new TreeSet();
        tree.add(1233);
        tree.add(1);
        tree.add(12);
        tree.add(123);
        tree.add(124);

        for (Integer s:tree){
            System.out.println(s);
        }
    }
}


对于自定义的类型来说,TreeSet无法进行自动排序
定义一个Student类型,对于Student类型来说,无法排序
因为没有指定Student对象之间的比较规则。
以下程序运行会出现异常:Mapiiiiii.Student cannot be cast to java.lang.Comparable
出现这个异常的原因是:
其他类型源码中都有Comparable。

Student类没有实现java.lang.Comparable接口

package Mapiiiiii;

import java.util.TreeSet;
public class ZDyitest {
    public static void main(String[] args) {
        TreeSet tree = new TreeSet<>();
        Student s1 = new Student(32);
        Student s2 = new Student(3);
        Student s3 = new Student(40);
        Student s4 = new Student(31);
        tree.add(s1);
        tree.add(s2);
        tree.add(s3);
        tree.add(s4);
        //遍历
        for (Student s: tree){
            System.out.println(s);
        }
    }
}
class Student{
    int age;

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

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


放在TreeSet集合中的元素要实现:java.lang.Comparable接口,并且实现compareTo方法,equals方法可以不写

package Mapiiiiii;

import java.util.TreeSet;
public class ZDyitest {
    public static void main(String[] args) {
        TreeSet tree = new TreeSet<>();
        Student s1 = new Student(32);
        Student s2 = new Student(3);
        Student s3 = new Student(40);
        Student s4 = new Student(31);
        tree.add(s1);
        tree.add(s2);
        tree.add(s3);
        tree.add(s4);
        //遍历
        for (Student s: tree){
            System.out.println(s);
        }
    }
}

//放在TreeSet集合中的元素要实现:java.lang.Comparable接口,
// 并且实现compareTo方法,equals方法可以不写**
class Student implements Comparable{
    int age;
    public Student(int age) {
        this.age=age;
    }
    @Override
    public String toString() {
        return "Student{" +
                "age=" + age +
                '}';
    }
     //需要在这个方法中编写比较的逻辑,按照什么进行比较
    //比较规则还是需要我们自己去写
    //k.compareTo(t.key)
    //拿着参数k和集合中的每一个元素k进行比较
    @Override
    public int compareTo(Student student) {
        
        return this.age-student.age;//用到了二叉排序树的知识
    }
}

自己写了比较规则后就会按照自己的规则排序了。
再练习写一下比较规则

package Mapiiiiii;

import java.util.TreeSet;

public class ZidingRuletest {
    public static void main(String[] args) {
        TreeSet  tr=new TreeSet<>();
        //以下两种方法都可以
        
        tr.add(new user("xiaoming",45));
        tr.add(new user("xiaohua",43));
        tr.add(new user("wanggui",45));
        tr.add(new user("lihai",21));
        tr.add(new user("zhangsan",25));

        for(user u:tr){
            System.out.println(u);
        }

    }
}

class user implements Comparable{

    String name;
    int age;
    public user() {
    }

    public user(String name,int age) {
        this.name = name;
        this.age = age;
    }
    @Override
    public String toString() {
        return "user{" +
                "age=" + age +
                ", name='" + name + ''' +
                '}';
    }

    @Override
    public int compareTo(user user) {
        //年龄相同时按照名字排序
        //姓名是String类型,可以直接调用compareTo来完成比较
        if(this.age==user.age){
            return this.name.compareTo(user.name);
        }else
            return this.age-user.age;
    }
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/825654.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号