java集合Set的应用(HashSet、Tree…

集合存放的都是对象的引用。
Collection:
 |——List
 |--Set
  |--HashSet:无序、无角标、不能存重复的元素;底层采用哈希表数据结构,通过哈希值来确定元素的位置,保证元素的唯一性是通过hashCoode方法
       和equals方法来完成的。当哈希值不相同时,不需要判断equals方法,只要当哈希值相同的,菜判断equals方法,equals放回false,则在哈希表顺延存贮.
  |--TreeSet:可以对集合中的元素进行排序.采用二叉树数据结构,大的放到树的右边,小的放左边.
       排序方式一:让元素自己身具备比较性。实现Comparable的compareTo方法来排序,如果该方法始终返回正数,则输出的顺序跟存入的顺序一致;
             如果始终返回负数,则为倒序;如果始终返回0,则只能存一个对象(保证元素的唯一性).一般而言,在此方法中,
          都需要先判断主要条件,在判断次要条件进行排序。
       当元素自身不具备比较性或者元素自身具备的比较性并不是所需要的,这是就需要第二种排序方式.
       排序方式二:让容器一初始化就具备比较性.这时就要用到比较器:Comparator接口,只要声明一个类来实现这个接口,并覆盖它的compare方法,我们就
          可以利用TreeSet的构造函数 TreeSet(Comparator<? super E> comparator) 让其一初始化就有了比较性.
    
       注意:当TreeSet中的对象具备了可比性(实现了Comparable接口,方式一),而集合本身也具备可比性(方式二),则以方式二为主.
 |--...

import java.util.*;

class HashSetDemo
{
 public static void main(String[] args)
 {
  //****HashSet Demo****
  HashSet hs = new HashSet();
  hs.add(new Student("zhangsan", 20));
  hs.add(new Student("lisi", 25));
  hs.add(new Student("lisi", 25));
  for (Iterator it = hs.iterator(); it.hasNext(); )
  {
   System.out.println(it.next());
  }

  //****TreeSet Demo排序方式一****
  TreeSet ts = new TreeSet();
  ts.add(new Person("zhangsan", 20));
  ts.add(new Person("lisi", 25));
  ts.add(new Person("wangwu", 22));
  ts.add(new Person("zhouliu", 15));
  ts.add(new Person("zhaoqi", 25));
  
  for (Iterator it = ts.iterator(); it.hasNext(); )
  {
  System.out.println(it.next());
  }

  ****TreeSet Demo排序方式二****
  TreeSet ts1 = new TreeSet(new PsCompare());
  ts1.add(new Person1("zhangsan", 20));
  ts1.add(new Person1("lisi", 25));
  ts1.add(new Person1("wangwu", 22));
  ts1.add(new Person1("zhouliu", 15));
  ts1.add(new Person1("zhaoqi", 25));
  
  for (Iterator it = ts1.iterator(); it.hasNext(); )
  {
   System.out.println(it.next());
  }
 }
}

//*****************HashSet*********************
class Student
{
 private String name;
 private int age;
 Student(String name, int age)
 {
  this.name = name;
  this.age = age;
 }

 public int hashCode()
 {
  System.out.println(this.name+"...hashCode run");
  return name.hashCode() + age*28;
 }

 public boolean equals(Object obj)
 {
  System.out.println(this.name+"...equals run");
  Student p = (Student)obj;
  return this.name.equals(p.name) && this.age == p.age;
 }

 //public String toString()
 //{
  //return "name="+this.name+",age="+this.age;
 //}
}


//*****************TreeSet 排序方式一***********************
class Person implements Comparable
{
 private String name;
 private int age;
 Person(String name, int age)
 {
  this.name = name;
  this.age = age;
 }

 public String toString()
 {
  return "name="+this.name+",age="+this.age;
 }

 public int compareTo(Object obj)   //实现Comparable的compareTo方法.通常需要判断条件的主次,
            //先判断主要条件,在判断次要条件.
 {
  //return 2;  //有序的输出,顺序跟录入的顺序一致.
  //return -2; //倒序输出.
  //return 0; //只能存贮一个对象.
  Person p = (Person)obj;
  if (this.age > p.age)  //正数————主要条件.
   return 1;
  if (this.age == p.age)  //零 ____:怎么实现年龄相同就按照姓名来进行排序呢?
  
   int num = this.name.compareTo(p.name);  //————次要条件
   if (num > 0)
    return 1;
   if (num == 0)
    return 0;
   return -1;
   //或者优化写成:
   //return this.name.compareTo(s.name);
  
  return -1;
 }
}

//*****************TreeSet 排序方式二***********************
class PsCompare implements Comparator
{
 public int compare(Object ob1, Object ob2) 
 {
  Person1 ps1 = (Person1)ob1;
  Person1 ps2 = (Person1)ob2;
  if (ps1.getAge() > ps2.getAge())
   return 1;
  else if (ps1.getAge() == ps2.getAge())
   return ps1.getName().compareTo(ps2.getName());
  return -1;
 }
}

class Person1
{
 private String name;
 private int age;
 Person1(String name, int age)
 {
  this.name = name;
  this.age = age;
 }
 public String getName()
 {
  return name;
 }
 public int getAge()
 {
  return age;
 }
 public String toString()
 {
  return "name="+this.name+",age="+this.age;
 
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值