7、Collection(Set集合)

HashSet:
HashSet:数据结构是哈希表,数据是非同步的
                  如何保证元素唯一性?
                  是通过元素的两个方法,hashCode和equals来完成。、
                  如果元素的hashCode值不同,才会判断equals是否为true
                  如果元素的hashCode值相同,不会调用equals方法
                  注意:对于判断的元素是否存在,以及删除等操作,依赖的是hashCode和equals方式  先判断hashCode

排序时,当主要条件相同时,一定要判断一下次要条件

package SetPackage;
import java.util.HashSet;
import java.util.Iterator;
public class HashSetDemo1 {
   
    public static void main(String[] args) 
    {   
        HashSet hs = new HashSet();
        hs.add(new Person2("Java1", 04));
        hs.add(new Person2("Java2", 06));
        hs.add(new Person2("Java3", 01));
        hs.add(new Person2("Java3", 01));
        hs.add(new Person2("Java4", 02));
        for(Iterator it = hs.iterator(); it.hasNext();)
        {
            Person2 p = (Person2) it.next();
            System.out.println(p.toString()+" ");//迭代器输出
        }
    }
}
   
class Person2 implements Comparable<Person2>
{
    private String name;
    private int age;
    Person2(String name,int age) 
    {
        this.name = name;
        this.age = age;
    }
    public void setName(String name) 
    {
        this.name = name;
    }
    public void setAge(int age) 
    {
        this.age = age;
    }   
    public String toString()
    {
        return name+" "+age;
    }
    public int compareTo(Person2 s) 
    {
    int num = new Integer(this.age).compareTo(new Integer(s.age));
    if(num == 0)
        return this.name.compareTo(s.name);
    return num;
    }
    public int hashCode()
    {
        return name.hashCode()+age*13;
    }
    public boolean equals(Object obj)
    {       
        if(!(obj instanceof Person2))
            return false;
        Person2 p =(Person2)obj;
        return this.name.equals(p.name) && this.age == p.age;
    }
}

TreeSet:
TreeSet:输出时可以对Set集合中的元素进行排序
                底层数据结构是二叉树。
                保证元素唯一性的依据。
                compareTo方法return 0。


TreeSet排序方式一:
让元素自身具备比较性。
元素需要实现Compareble接口,覆盖compareTo方法
这种方式也称为自然顺序,也是默认顺序

package SetPackage;
 
import java.util.Iterator;
import java.util.TreeSet; 
public class TreeSetDemo1 
{ 
    public static void main(String[] args) 
    {
        TreeSet tree = new TreeSet();   
        tree.add(new Student("冯国璋", 70));
        tree.add(new Student("段祺瑞", 70)); 
        tree.add(new Student("李鴻章", 40));
        tree.add(new Student("袁世凱", 54));
 
        for(Iterator it = tree.iterator();it.hasNext();)
        {
            Student stu = (Student)it.next();
            System.out.println(stu.toString());
        }
    }   
}
 
class Student implements Comparable//该接口强制让学生具备比较性
{
    private String name;
    private int age;
    Student(String name,int age)
    {
        this.name = name;
        this.age = age;
    }   
    public String toString()
    {
        return name+" "+age;
    }
 
    @Override
    public int compareTo(Object obj) 
    {
        Student s = (Student)obj;
        if(obj instanceof Person2)
            throw new RuntimeException("不是学生对象");
        if(this.age>s.age)
        {
            return 1;
        }
        if(this.age == s.age)
        {
            return this.name.compareTo(s.name);
        }
        return -1;
    }
}
TreeSet排序方式二:
当元素自身不具备比较性时,或者具备的比较性不是所需要的,
这时就需要让集合自身具备比较性
集合初始化时,就有了比较方式
当两种排序都存在时,以比较器为主

package SetPackage;
 
import java.util.Comparator;
import java.util.Iterator;
import java.util.TreeSet; 
public class TreeSetDemo3 {
 
    public static void main(String[] args) 
    {
        TreeSet tree = new TreeSet(new StrLenCompare()/*比较器*/);
        tree.add("a");
        tree.add("sd");
        tree.add("sdfsfdsdf");
        tree.add("gfg");
 
        for(Iterator it = tree.iterator(); it.hasNext();)
        {
            System.out.println(it.next());
        }
    } 
}
 
class StrLenCompare implements Comparator
{
    public int compare(Object o1, Object o2)
    {
        String s1 = (String)o1;
        String s2 = (String)o2;
        int num = new Integer(s1.length()).compareTo(s2.length()); 
        if(num == 0)
            return s1.compareTo(s2);
        return num;
    }
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值