`
bolange
  • 浏览: 27149 次
  • 性别: Icon_minigender_1
  • 来自: 福州
社区版块
存档分类
最新评论

集合框架——Set

    博客分类:
  • Java
阅读更多

      Set集合为集类型,集是最简单的一种集合,存放于集中的对象不按特定方式排序,只是简单地把对象加入集合中,类似于向口袋里放东西。对集中存在的对象的访问和操作是通过对象的引用进行的,因此在集中不能存放重复对象。Set集合包括Set接口以及Set接口的所有实现类。因为Set接口继承了Collection接口,所以Set接口拥有Collection接口提供的所有常用方法。

1. 使用HashSet类 
      由HashSet类实现的Set集合的优点是能够快速定位集合中的元素。 
      由HashSet类实现的Set集合中的对象必须是惟一的,因此需要添加到由HashSet类实现的Set集合中的对象,需要重新实现equals()方法,从而保证插入集合中对象的标识的惟一性。 
      由HashSet类实现的Set集合的排列方式为按照哈希码排序,根据对象的哈希码确定对象的存储位置,因此需要添加到由HashSet类实现的Set集合中的对象,还需要重新实现hashCode()方法,从而保证插入集合中的对象能够合理地分布在集合中,以便于快速定位集合中的对象。 
      由于Set集合中的对象是无序的,这里所谓的无序并不是完全无序,只是不像List集合按对象的插入顺序保存对象。
例如:
源文件:Person.java

Java代码 复制代码
  1. public class Person{   
  2.     private String name;   
  3.     private long id_card;   
  4.     public Person(String name,long id_card){   
  5.         this.name = name;   
  6.         this.id_card = id_card;   
  7.     }   
  8.     public long getId_card(){   
  9.         return id_card;   
  10.     }   
  11.     public void setId_card(long id_card){   
  12.         this.id_card = id_card;   
  13.     }   
  14.     public String getName(){   
  15.         return name;   
  16.     }   
  17.     public void setName(String name){   
  18.         this.name = name;   
  19.     }   
  20.     public int hashCode(){//重新实现hashCode()方法   
  21.         final int PRIME = 31;   
  22.         int result = 1;   
  23.         result = PRIME*result+(int)(id_card^(id_card>>>32));   
  24.         result = PRIME*result+((name ==null)?0:name.hashCode());   
  25.         return result;   
  26.     }   
  27.     public boolean equals(Object obj){//重新实现equals()方法   
  28.         if(this == obj){   
  29.             return true;   
  30.         }   
  31.         if(obj == null){   
  32.             return false;   
  33.         }   
  34.         if(getClass()!=obj.getClass()){   
  35.             return false;   
  36.         }   
  37.         final Person other = (Person)obj;   
  38.         if(id_card!=other.id_card){   
  39.             return false;   
  40.         }   
  41.         if(name == null){   
  42.             if(other.name != null){   
  43.                 return false;   
  44.             }   
  45.         }   
  46.         else if(!name.equals(other.name)){   
  47.             return false;   
  48.         }   
  49.         return true;   
  50.     }   
  51. }  


源文件:TestSet.java

Java代码 复制代码
  1. import java.util.*;   
  2. public class TestSet{   
  3.     public static void main(String args[]){   
  4.         Set<Person> hashSet = new HashSet<Person>();   
  5.         hashSet.add(new Person("马先生",22015));   
  6.         hashSet.add(new Person("李小姐",22018));   
  7.         hashSet.add(new Person("李先生",22020));   
  8.         Iterator<Person> it = hashSet.iterator();   
  9.         while(it.hasNext()){   
  10.             Person person = it.next();   
  11.             System.out.println(person.getName()+"   "+person.getId_card());   
  12.         }   
  13.     }   
  14. }  


程序的运行结果如下:
李小姐  22018
李先生  22020
马先生  22015
 
      如果既想保留HashSet类快速定位集合中对象的优点,又想让集合中的对象按插入的顺序保存,可以通过HashSet类的子类LinkedHashSet实现Set集合,即修改上述代码如下:

Java代码 复制代码
  1. Set<Person> hashSet = new HashSet<Person>();  


修改为:

Java代码 复制代码
  1. Set<Person> hashSet = new LinkedHashSet<Person>();  


2. 使用TreeSet类 
      TreeSet类不仅实现了Set接口,还实现了java.util.SortedSet接口,从而保证在遍历集合时按照递增的顺序获得对象。遍历对象时可能是按照自然顺序递增排列,因此存入用TreeSet类实现的Set集合的对象必须实现Comparable接口;也可能是按照指定比较器递增排序,即可以通过比较器对用TreeSet类实现的Set集合中的对象进行排序。 
      TreeSet类通过实现java.util.SortedSet接口增加的方法如下表4所示:



例如:
源文件:Person.java

Java代码 复制代码
  1. public class Person implements Comparable{   
  2.     private String name;   
  3.     private long id_card;   
  4.     public Person(String name,long id_card){   
  5.         this.name = name;   
  6.         this.id_card = id_card;   
  7.     }   
  8.     public String getName(){   
  9.         return name;   
  10.     }   
  11.     public void setName(String name){   
  12.         this.name = name;   
  13.     }   
  14.     public long getId_card(){   
  15.         return id_card;   
  16.     }   
  17.     public void setId_card(long id_card){   
  18.         this.id_card = id_card;   
  19.     }   
  20.     public int compareTo(Object o){//默认按编号升序排序   
  21.         Person person = (Person)o;   
  22.         int result = id_card>person.id_card?1:(id_card==person.id_card?0:-1);   
  23.         return result;   
  24.     }   
  25. }  


源文件:TestSet.java

Java代码 复制代码
  1. import java.util.*;   
  2. public class TestSet{   
  3.     public static void main(String args[]){   
  4.         TreeSet<Person> treeSet = new TreeSet<Person>();   
  5.         Person p1 = new Person("马先生",22015);   
  6.         Person p2 = new Person("李先生",22016);   
  7.         Person p3 = new Person("王小姐",22018);   
  8.         Person p4 = new Person("尹先生",22020);   
  9.         Person p5 = new Person("王先生",22012);   
  10.         treeSet.add(p1);   
  11.         treeSet.add(p2);   
  12.         treeSet.add(p3);   
  13.         treeSet.add(p4);   
  14.         treeSet.add(p5);   
  15.         System.out.println("初始化的集合:");   
  16.         Iterator<Person> it = treeSet.iterator();   
  17.         while(it.hasNext()){   
  18.             Person p = it.next();   
  19.             System.out.println(p.getId_card()+" "+p.getName());   
  20.         }   
  21.         System.out.println("截取前面部分得到的集合:");   
  22.         it = treeSet.headSet(p1).iterator();   
  23.         while(it.hasNext()){   
  24.             Person p = it.next();   
  25.             System.out.println(p.getId_card()+" "+p.getName());   
  26.         }   
  27.         System.out.println("截取中间部分得到的集合:");   
  28.         it = treeSet.subSet(p1,p3).iterator();   
  29.         while(it.hasNext()){   
  30.             Person p = it.next();   
  31.             System.out.println(p.getId_card()+" "+p.getName());   
  32.         }   
  33.         System.out.println("截取后面部分得到的集合:");   
  34.         it = treeSet.tailSet(p3).iterator();   
  35.         while(it.hasNext()){   
  36.             Person p = it.next();   
  37.             System.out.println(p.getId_card()+" "+p.getName());   
  38.         }   
  39.     }   
  40. }  


程序的运行结果如下:
初始化的集合:
22012   王先生
22015   马先生
22016   李先生
22018   王小姐
22020   尹先生
截取前面部分得到的集合:
22012   王先生
截取中间部分得到的集合:
22015   马先生
22016   李先生
截取后面部分得到的集合:
22018   王小姐
22020   尹先生
 
      在使用由TreeSet类实现的Set集合时,也可以通过单独的比较器对集合中的对象进行排序。 
      例如: 
      比较器既可以作为一个单独的类,也可以作为对应类的内部类,本例中移内部类的形式实现比较器。
源文件:Person.java

Java代码 复制代码
  1. import java.util.Comparator;   
  2. public class Person implements Comparable{   
  3.     private String name;   
  4.     private long id_card;   
  5.     public Person(String name,long id_card){   
  6.         this.name = name;   
  7.         this.id_card = id_card;   
  8.     }   
  9.     public String getName(){   
  10.         return name;   
  11.     }   
  12.     public void setName(String name){   
  13.         this.name = name;   
  14.     }   
  15.     public long getId_card(){   
  16.         return id_card;   
  17.     }   
  18.     public void setId_card(long id_card){   
  19.         this.id_card = id_card;   
  20.     }   
  21.     public int compareTo(Object o){//默认按编号升序排序   
  22.         Person person = (Person)o;   
  23.         int result = id_card>person.id_card?1:(id_card==person.id_card?0:-1);   
  24.         return result;   
  25.     }   
  26.     static class PersonComparator implements Comparator{   
  27.         public static final int NAME = 1;   
  28.         public static final int ID_CARD = 2;   
  29.         private int orderByColumn = 1;//默认为按姓名排序   
  30.         public static final boolean ASC = true;   
  31.         public static final boolean DESC = false;   
  32.         private boolean orderByMode = true;//默认为按升序排序   
  33.         public int compare(Object o1,Object o2){//实现Comparator接口的方法   
  34.             Person p1 = (Person)o1;   
  35.             Person p2 = (Person)o2;   
  36.             int result = 0;//默认的判断结果为两个对象相等   
  37.             switch(orderByColumn){//判断排序条件   
  38.                 case 1:   
  39.                     String s1 = CnToSpell.getFullSpell(p1.getName());   
  40.                     String s2 = CnToSpell.getFullSpell(p2.getName());    
  41.                     if(orderByMode){//升序   
  42.                         result = s1.compareTo(s2);   
  43.                     }   
  44.                     else{//降序   
  45.                         result = s2.compareTo(s1);   
  46.                     }   
  47.                     break;   
  48.                 case 2:   
  49.                     if(orderByMode){//升序   
  50.                         result = (int)(p1.getId_card()-p2.getId_card());   
  51.                     }   
  52.                     else{//降序   
  53.                         result = (int)(p2.getId_card()-p1.getId_card());   
  54.                     }   
  55.                     break;   
  56.             }   
  57.             return result;   
  58.         }   
  59.         public void orderByColumn(int orderByColumn){//用来设置排序条件   
  60.             this.orderByColumn = orderByColumn;   
  61.         }   
  62.         public void orderByMode(boolean orderByMode){//用来设置排序方式   
  63.             this.orderByMode = orderByMode;   
  64.         }   
  65.     }   
  66. }  


源文件:TestSet.java

Java代码 复制代码
  1. import java.util.*;   
  2. public class TestSet{   
  3.     public static void main(String args[]){   
  4.         TreeSet<Person> treeSet1 = new TreeSet<Person>();   
  5.         Person p1 = new Person("马先生",22015);   
  6.         Person p2 = new Person("李先生",22016);   
  7.         Person p3 = new Person("王小姐",22018);   
  8.         treeSet1.add(p1);   
  9.         treeSet1.add(p2);   
  10.         treeSet1.add(p3);   
  11.         System.out.println("客户化排序前,默认按编号升序排序:");   
  12.         //新创建一个Set集合,不进行客户化排序,默认按编号升序排序   
  13.         TreeSet<Person> treeSet2 = new TreeSet<Person>(treeSet1);//通过构造函数初始化集合   
  14.         Iterator<Person> it1 = treeSet2.iterator();   
  15.         while(it1.hasNext()){   
  16.             Person p = it1.next();   
  17.             System.out.println(p.getId_card()+" "+p.getName());   
  18.         }   
  19.         System.out.println("客户化排序后,按编号降序排序:");   
  20.         //新创建一个Set集合,进行客户化排序,客户化排序方式为按编号降序排序   
  21.         Person.PersonComparator pc = new Person.PersonComparator();//创建比较器(内部类)的实例   
  22.         pc.orderByColumn(Person.PersonComparator.ID_CARD);//设置排序依据的属性   
  23.         pc.orderByMode(Person.PersonComparator.DESC);//设置排序方式   
  24.         TreeSet<Person> treeSet3 = new TreeSet<Person>(pc);//必须通过构造函数设置比较器   
  25.         treeSet3.addAll(treeSet1);//初始化集合   
  26.         Iterator<Person> it2 = treeSet3.iterator();   
  27.         while(it2.hasNext()){   
  28.             Person p = it2.next();   
  29.             System.out.println(p.getId_card()+" "+p.getName());   
  30.         }   
  31.     }   
  32. }  


程序的运行结果如下:
客户化排序前,默认按编号升序排序:
22015   马先生
22016   李先生
22018   王小姐
客户化排序后,按编号降序排序:
22018   王小姐
22016   李先生
22015   马先生

 

 

分享到:
评论

相关推荐

    Java面试题资料,包含核心知识,消息队列,大数据等

    这份资料不仅应该触及Java的基石——例如JVM的工作原理、内存模型、垃圾回收机制,以及Java的集合框架中的核心接口与实现类,如List、Set、Map等,更应对Java的异常处理机制有深入的剖析 此外,考虑到Java技术的...

    JAVA入门1.2.3:一个老鸟的JAVA学习心得 PART1(共3个)

    3.4 小结:基本数据类型—— Java中一切数据和运算的基础 63 3.5 习题 65 第4章 Java中的程序执行流程 67 教学视频:1小时57分钟 4.1 顺序执行 67 4.2 使用if-else让程序懂得判断 68 4.2.1 if语句 68 4.2.2 ...

    Java入门1·2·3:一个老鸟的Java学习心得.PART3(共3个)

    3.4 小结:基本数据类型—— Java中一切数据和运算的基础 63 3.5 习题 65 第4章 Java中的程序执行流程 67 教学视频:1小时57分钟 4.1 顺序执行 67 4.2 使用if-else让程序懂得判断 68 4.2.1 if语句 68 4.2.2 ...

    javaSE代码实例

    第14章 集合框架——强大的对象管理器 270 14.1 Object类——所有类的超类 270 14.1.1 toString方法的重写 270 14.1.2 equals方法的意义 271 14.1.3 hashCode方法的意义 272 14.2 重写equals与hashCode...

    Java Web编程宝典-十年典藏版.pdf.part2(共2个)

    9.2.6 访问List、Set、M印集合 9.2.7 投影与选择 9.3 Struts2的标签库 9.3.1 数据标签的应用 9.3.2 控制标签的应用 9.3.3 表单标签的应用 …… 第10章 邂逅数据库持久化利器 第11章 探秘数据库持久化利器 第12章 ...

    Java开发技术大全 电子版

    14.6.1框架类(JFrame)使用示例469 14.6.2小应用程序(JApplet)使用示例472 14.6.3对话框(JDialog)使用示例473 14.7中间容器476 14.7.1面板(JPanel)使用示例476 14.7.2滚动面板(JScrollPane)使用示例...

    android群雄传

    7.1 Android View动画框架 163 7.1.1 透明度动画 163 7.1.2 旋转动画 163 7.1.3 位移动画 164 7.1.4 缩放动画 164 7.1.5 动画集合 164 7.2 Android属性动画分析 165 7.2.1 ObjectAnimator 166 7.2.2 ...

    Struts2 in action中文版

    7.3.3 基于集合的组件 159 7.3.4 额外的组件 166 7.4 小结 168 第8章 结果 170 8.1 动作之后 170 8.1.1 页面上:如何使用自定义结果组件构建Struts 2 Ajax应用程序 171 8.1.2 实现JSON结果类型 173 8.2 常用的结果...

    深入浅出ES6 简体中文

    迭代器Iterator、生成器Generators、不定参数Rest、默认参数Default、解构Destructuring、生成器Generator、代理Proxy,以及几种新类型:Set、Map、WeakSet、WeakMap、集合Collection。 以上提及的新特性只是其中的...

    低清版 大型门户网站是这样炼成的.pdf

    6.4 “桃园三结义”——ssh 2组合开发框架始成 404 6.4.1 spring 2.5集成orm中间件hibernate 3.2 404 6.4.2 spring 2.5集成mvc框架struts 2 411 6.4.3 ssh 2组合框架的基本开发步骤—eportal启程 414 6.5 小结 ...

    李兴华 Java Web 开发实战经典_带源码_高清pdf 带书签 上

    10.3、集合操作 10.4、在MVC中应用表达式语言 10.5、运算符 10.6、本章摘要 10.7、开发实战讲解(基于Oracle数据库) 第11章 Tomcat数据源 11.1、数据源操作原理 11.2、在Tomcat中使用数据库连接池 11.3、...

    MLDN+李兴华+Java+Web开发实战经典.part3.rar )

    10.3、集合操作 10.4、在MVC中应用表达式语言 10.5、运算符 10.6、本章摘要 10.7、开发实战讲解(基于Oracle数据库) 第11章 Tomcat数据源 11.1、数据源操作原理 11.2、在Tomcat中使用数据库连接池 ...

    李兴华 java_web开发实战经典 源码 完整版收集共享

    10.3、集合操作 10.4、在MVC中应用表达式语言 10.5、运算符 10.6、本章摘要 10.7、开发实战讲解(基于Oracle数据库) 第11章 Tomcat数据源 11.1、数据源操作原理 11.2、在Tomcat中使用数据库连接池 11.3、...

    李兴华 Java Web 开发实战经典_带源码_高清pdf 带书签 下

    10.3、集合操作 10.4、在MVC中应用表达式语言 10.5、运算符 10.6、本章摘要 10.7、开发实战讲解(基于Oracle数据库) 第11章 Tomcat数据源 11.1、数据源操作原理 11.2、在Tomcat中使用数据库连接池 11.3、...

    李兴华Java Web开发实战经典.pdf (高清版) Part1

    10.3、集合操作 10.4、在MVC中应用表达式语言 10.5、运算符 10.6、本章摘要 10.7、开发实战讲解(基于Oracle数据库) 第11章 Tomcat数据源 11.1、数据源操作原理 11.2、在Tomcat中使用数据库连接池 ...

    李兴华 Java Web 开发实战经典 高清扫描版Part3

    10.3、集合操作 10.4、在MVC中应用表达式语言 10.5、运算符 10.6、本章摘要 10.7、开发实战讲解(基于Oracle数据库) 第11章 Tomcat数据源 11.1、数据源操作原理 11.2、在Tomcat中使用数据库连接池 11.3、...

    java web 视频、电子书、源码(李兴华老师出版)

    10.3、集合操作 10.4、在MVC中应用表达式语言 10.5、运算符 10.6、本章摘要 10.7、开发实战讲解(基于Oracle数据库) 第11章 Tomcat数据源 11.1、数据源操作原理 11.2、在Tomcat中使用数据库连接池 ...

    李兴华Java Web开发实战经典(高清版) Part2

    10.3、集合操作 10.4、在MVC中应用表达式语言 10.5、运算符 10.6、本章摘要 10.7、开发实战讲解(基于Oracle数据库) 第11章 Tomcat数据源 11.1、数据源操作原理 11.2、在Tomcat中使用数据库连接池 ...

    外文翻译 stus MVC

    Struts——an open-source MVC implementation This article introduces Struts, a Model-View-Controller implementation that uses servlets and JavaServer Pages (JSP) technology. Struts can help you control...

    C#微软培训资料

    1.1 Microsoft.NET——一场新的革命.4 1.2 .NET 与 C#.6 1.3 C#语言的特点.8 1.4 小 结 .11 第二章 运行环境 全面了解.NET.12 2.1 .NET 结构.12 2.2 公用语言运行时环境与公用语言规范.13 2.3 开 发 ...

Global site tag (gtag.js) - Google Analytics