【JAVA】比较集合的大小

判断集合元素相等
集合判断相等的这个规范,不是说光针对HasSet,而是针对Collection的所子类。如果需要执行某种操作,需要判断对象是不是相等的时候,都靠的是规范来进行的。

我们一般不能拿等号来判断而是用equals。
还有一种方法,我们比较的则是集合元素的哈希码,且在集合中相同的值的哈希码是一样的。

而我们一般在判断的时候,两个都用来进行判断。我们要让集合能判断相等,就得要重写equals和HasSet方法

在集合比较大小的集合的时候,我们要继承Comparable,放进去的对象就需要实现规范。

比较集合的大小
所有集合跟我们放进去的东西都有一个约定———Comparable
在刚开始我们没有继承Comparable接口的时候,我们的运行窗口会报类转换异常。那么,对于我们排序集来讲,就要有一个要求:

所有的集合如果有比较大小的需求,且要判断两个对象谁大谁小。这个规则只有我们自己知道,且这个规则的制定只取决于我们自己。排序规则就像我们重写HasCode方法,要事先约定好,而这个约定是用接口写的。接口里面有我们都需要的规范,所以接口的作用是隔离调用者和实现者的。当我们把对象加进去之后,该方法给我们把对象转换成了接口。

public class Student implements Comparable {

有关TreeSet的详解,转大神博客,请点击该链接。
https://blog.csdn.net/zhaojie181711/article/details/80494318

整体代码如下

import java.util.HashSet;
import java.util.Objects;

public class Student implements Comparable {
    public Student(int id, String name, char sex) {
        this.id = id;
        this.name = name;
        this.sex = sex;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public char getSex() {
        return sex;
    }

    public void setSex(char sex) {
        this.sex = sex;
    }

    private int id;
    private String name;
    private char sex;

    public int hasCode() {
        return new Integer(id).hashCode() +
                name.hashCode() +
                new Character(sex).hashCode();
    }

//    public  boolean equals(Object obj){
//        if(obj instanceof  Student){
//            student s=(Student) obj;
//            if(s.id==this.id&&
//            /*s.name==this.name 因为字符串也是对象*/
//            //对象比较用equals
//            s.name.equals(this.name)&&
//            s.sex==this.sex){
//        }
//        return true;
//    }
//    return false;

    /**
     * Objects的工具类
     */
    //如果我们自己写的对象,
    //放到集合里,要让集合判断这两个对象相等,
    //一定要重写它的equals和HasCode。
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Student student = (Student) o;
        return id == student.id &&
                sex == student.sex &&
                Objects.equals(name, student.name);
    }

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

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

    /**
     * 升序排列
     *
     * @param o
     * @return
     */
    //返回1,是指我自己大于传进来的对象。
    //返回0,是指我自己和传进来的对象相等。
    //返回-1,是指我自己和传进来的对象相等。
    @Override
    public int compareTo(Object o) {
        if (o instanceof Student) {
            //这里就不用返回了,直接扔一个异常就行。
            //先把这个父类对象进行强制转换,
            //因为父类对象无法访问子类里的属性。
            Student s = (Student) o;
            if (this.id > s.id) {
                return 1;
            } else if (this.id < s.id) {
                return -1;
            }
            return 0;
        }
        throw new RuntimeException("类型不匹配,无法比较大小!");
    }

//    /**
//     * 降序排列
//     */
//    if(this.id >s.id){
//        return -1;
//    } else if(this.id<s.id){
//        return 1;
//    }
//    return 0;
//}
}

import java.util.Iterator;
import java.util.TreeSet;

public class Test2 {
    public static void main(String[] args) {
        TreeSet s=new TreeSet();
        s.add(20);
        s.add(22);
        s.add(19);
        s.add(11);
        Iterator iter=s.iterator();
        while(iter.hasNext()){
            System.out.println(iter.next());

            //升序排列
            s=new TreeSet();
            s.add(new Student(2000,"孙悟空",'m'));
            s.add(new Student(2001, "牛魔王", 'm'));
            s.add(new Student(1999, "紫霞", 'f'));
            iter=s.iterator();
            while(iter.hasNext()){
                System.out.println(iter.next());
            }
        }
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

_浮舍_

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

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

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

打赏作者

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

抵扣说明:

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

余额充值