关于set集合的排序问题

1.set集合

set集合是一种不包含重复元素的Collection,Set集合中主要有两个类:HashSet类和TreeSet类。一般情况我们使用hashset比较多。因为set集合默认是无序的。当我们想要对set集合进行排序时,会使用到TreeSet。

2.HashSet的使用及遍历

/**
 * @program:
 * @description
 * @author:Mr.Jia
 * @return:
 * @creattime:2019-03-11 21:55:50
 **/
public class TestSet {
    public static void main(String[] args) {
        Set<String> set=new HashSet();
        set.add("a");
        set.add("s");
        set.add("d");
        set.add("f");
        set.add("g");
        //遍历方式一:迭代遍历
        Iterator<String> stringIterator=set.iterator();
        while (stringIterator.hasNext()){
            String string=stringIterator.next();
            System.out.print(string+'\t');
        }
        System.out.println("");
        //增强for循坏遍历
        for (String string:set){
            System.out.print(string+'\t');
        }
    }
}

输出结果如下

当然set是不允许存放重复元素的,当我再一次添加一个“a”进入再输出set时

输出结果仍然为一个a。

这里我们在set中存放的是一个String类型的字符串,当我们存放的是我们的自定义类时,需要在类中重写equals方法和hashCode方法。(简单说一下为什么重写equals必须重写hashcode方法,是因为重写equals时,我们会对该类中的某些属性进行判断。而为了保证equals一致hashcode也一致,故需要重写hashcode方法)

@Override
public boolean equals(Object o) {
    if (this == o) return true;
    if (o == null || getClass() != o.getClass()) return false;
    Student student= (Student) o;
    return Objects.equals(id, Student.id);
}

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

这里我重写了equals方法,其中对Student类中的id进行了比较,当这两个类的id是相同的时候,equals便返回true。而如果我们没有重写hashcode方法,则会出现hashcode不一致而equals一致的情况。(因为没重写hashcode实际上是这两个对象在jvm内存堆上的地址,两个对象的地址肯定不同)

因为往HashSet中存放元素时,默认会对两个元素进行比较,首先会比较它们的HashCode,当HashCode相同时,再进行equals比较,如果返回true则证明两个元素相同,将不对该元素进行存放,如果是false,则会进行散列,然后存放。

3.TreeSet的排序

创建方法也是通过new关键字进行创建。与HashSet的极大不同是,你可以对TreeSet的元素进行排序。

排序分为自然排序与指定排序。

这里set1自动对集合内元素进行了升序排序。

这里我定义了一个类实现Comparator接口,其中定义了以降序的方式对set1中的元素进行排序。

那么如果是我们自定义的一个类型呢?

这里我定义一个Student类:

再写一个类实现Comparator接口,以id进行排序。

输出结果如下

这里以id进行了降序排列。

主要是为了让自己巩固一下TreeSet。

参考博客:https://blog.youkuaiyun.com/u014649337/article/details/43734863

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值