zoukankan      html  css  js  c++  java
  • Set集合

    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

    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. }  
    public class Person{
    	private String name;
    	private long id_card;
    	public Person(String name,long id_card){
    		this.name = name;
    		this.id_card = id_card;
    	}
    	public long getId_card(){
    		return id_card;
    	}
    	public void setId_card(long id_card){
    		this.id_card = id_card;
    	}
    	public String getName(){
    		return name;
    	}
    	public void setName(String name){
    		this.name = name;
    	}
    	public int hashCode(){//重新实现hashCode()方法
    		final int PRIME = 31;
    		int result = 1;
    		result = PRIME*result+(int)(id_card^(id_card>>>32));
    		result = PRIME*result+((name ==null)?0:name.hashCode());
    		return result;
    	}
    	public boolean equals(Object obj){//重新实现equals()方法
    		if(this == obj){
    			return true;
    		}
    		if(obj == null){
    			return false;
    		}
    		if(getClass()!=obj.getClass()){
    			return false;
    		}
    		final Person other = (Person)obj;
    		if(id_card!=other.id_card){
    			return false;
    		}
    		if(name == null){
    			if(other.name != null){
    				return false;
    			}
    		}
    		else if(!name.equals(other.name)){
    			return false;
    		}
    		return true;
    	}
    }

    源文件:TestSet.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. }  
    import java.util.*;
    public class TestSet{
    	public static void main(String args[]){
    		Set<Person> hashSet = new HashSet<Person>();
    		hashSet.add(new Person("马先生",22015));
    		hashSet.add(new Person("李小姐",22018));
    		hashSet.add(new Person("李先生",22020));
    		Iterator<Person> it = hashSet.iterator();
    		while(it.hasNext()){
    			Person person = it.next();
    			System.out.println(person.getName()+"	"+person.getId_card());
    		}
    	}
    }
    

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

    将Set<Person> hashSet = new HashSet<Person>(); 修改为: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

    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. }  
    public class Person implements Comparable{
    	private String name;
    	private long id_card;
    	public Person(String name,long id_card){
    		this.name = name;
    		this.id_card = id_card;
    	}
    	public String getName(){
    		return name;
    	}
    	public void setName(String name){
    		this.name = name;
    	}
    	public long getId_card(){
    		return id_card;
    	}
    	public void setId_card(long id_card){
    		this.id_card = id_card;
    	}
    	public int compareTo(Object o){//默认按编号升序排序
    		Person person = (Person)o;
    		int result = id_card>person.id_card?1:(id_card==person.id_card?0:-1);
    		return result;
    	}
    }

    源文件:TestSet.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. }  
    import java.util.*;
    public class TestSet{
    	public static void main(String args[]){
    		TreeSet<Person> treeSet = new TreeSet<Person>();
    		Person p1 = new Person("马先生",22015);
    		Person p2 = new Person("李先生",22016);
    		Person p3 = new Person("王小姐",22018);
    		Person p4 = new Person("尹先生",22020);
    		Person p5 = new Person("王先生",22012);
    		treeSet.add(p1);
    		treeSet.add(p2);
    		treeSet.add(p3);
    		treeSet.add(p4);
    		treeSet.add(p5);
    		System.out.println("初始化的集合:");
    		Iterator<Person> it = treeSet.iterator();
    		while(it.hasNext()){
    			Person p = it.next();
    			System.out.println(p.getId_card()+"	"+p.getName());
    		}
    		System.out.println("截取前面部分得到的集合:");
    		it = treeSet.headSet(p1).iterator();
    		while(it.hasNext()){
    			Person p = it.next();
    			System.out.println(p.getId_card()+"	"+p.getName());
    		}
    		System.out.println("截取中间部分得到的集合:");
    		it = treeSet.subSet(p1,p3).iterator();
    		while(it.hasNext()){
    			Person p = it.next();
    			System.out.println(p.getId_card()+"	"+p.getName());
    		}
    		System.out.println("截取后面部分得到的集合:");
    		it = treeSet.tailSet(p3).iterator();
    		while(it.hasNext()){
    			Person p = it.next();
    			System.out.println(p.getId_card()+"	"+p.getName());
    		}
    	}
    }
    

    程序的运行结果如下: 初始化的集合: 22012   王先生 22015   马先生 22016   李先生 22018   王小姐 22020   尹先生 截取前面部分得到的集合: 22012   王先生 截取中间部分得到的集合: 22015   马先生 22016   李先生 截取后面部分得到的集合: 22018   王小姐 22020   尹先生 在使用由TreeSet类实现的Set集合时,也可以通过单独的比较器对集合中的对象进行排序。 例如: 比较器既可以作为一个单独的类,也可以作为对应类的内部类,本例中移内部类的形式实现比较器。 源文件:Person.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. }  
    import java.util.Comparator;
    public class Person implements Comparable{
    	private String name;
    	private long id_card;
    	public Person(String name,long id_card){
    		this.name = name;
    		this.id_card = id_card;
    	}
    	public String getName(){
    		return name;
    	}
    	public void setName(String name){
    		this.name = name;
    	}
    	public long getId_card(){
    		return id_card;
    	}
    	public void setId_card(long id_card){
    		this.id_card = id_card;
    	}
    	public int compareTo(Object o){//默认按编号升序排序
    		Person person = (Person)o;
    		int result = id_card>person.id_card?1:(id_card==person.id_card?0:-1);
    		return result;
    	}
    	static class PersonComparator implements Comparator{
    		public static final int NAME = 1;
    		public static final int ID_CARD = 2;
    		private int orderByColumn = 1;//默认为按姓名排序
    		public static final boolean ASC = true;
    		public static final boolean DESC = false;
    		private boolean orderByMode = true;//默认为按升序排序
    		public int compare(Object o1,Object o2){//实现Comparator接口的方法
    			Person p1 = (Person)o1;
    			Person p2 = (Person)o2;
    			int result = 0;//默认的判断结果为两个对象相等
    			switch(orderByColumn){//判断排序条件
    				case 1:
    					String s1 = CnToSpell.getFullSpell(p1.getName());
    					String s2 = CnToSpell.getFullSpell(p2.getName()); 
    					if(orderByMode){//升序
    						result = s1.compareTo(s2);
    					}
    					else{//降序
    						result = s2.compareTo(s1);
    					}
    					break;
    				case 2:
    					if(orderByMode){//升序
    						result = (int)(p1.getId_card()-p2.getId_card());
    					}
    					else{//降序
    						result = (int)(p2.getId_card()-p1.getId_card());
    					}
    					break;
    			}
    			return result;
    		}
    		public void orderByColumn(int orderByColumn){//用来设置排序条件
    			this.orderByColumn = orderByColumn;
    		}
    		public void orderByMode(boolean orderByMode){//用来设置排序方式
    			this.orderByMode = orderByMode;
    		}
    	}
    }
    

    源文件:TestSet.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. }  
    import java.util.*;
    public class TestSet{
    	public static void main(String args[]){
    		TreeSet<Person> treeSet1 = new TreeSet<Person>();
    		Person p1 = new Person("马先生",22015);
    		Person p2 = new Person("李先生",22016);
    		Person p3 = new Person("王小姐",22018);
    		treeSet1.add(p1);
    		treeSet1.add(p2);
    		treeSet1.add(p3);
    		System.out.println("客户化排序前,默认按编号升序排序:");
    		//新创建一个Set集合,不进行客户化排序,默认按编号升序排序
    		TreeSet<Person> treeSet2 = new TreeSet<Person>(treeSet1);//通过构造函数初始化集合
    		Iterator<Person> it1 = treeSet2.iterator();
    		while(it1.hasNext()){
    			Person p = it1.next();
    			System.out.println(p.getId_card()+"	"+p.getName());
    		}
    		System.out.println("客户化排序后,按编号降序排序:");
    		//新创建一个Set集合,进行客户化排序,客户化排序方式为按编号降序排序
    		Person.PersonComparator pc = new Person.PersonComparator();//创建比较器(内部类)的实例
    		pc.orderByColumn(Person.PersonComparator.ID_CARD);//设置排序依据的属性
    		pc.orderByMode(Person.PersonComparator.DESC);//设置排序方式
    		TreeSet<Person> treeSet3 = new TreeSet<Person>(pc);//必须通过构造函数设置比较器
    		treeSet3.addAll(treeSet1);//初始化集合
    		Iterator<Person> it2 = treeSet3.iterator();
    		while(it2.hasNext()){
    			Person p = it2.next();
    			System.out.println(p.getId_card()+"	"+p.getName());
    		}
    	}
    }
    

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

  • 相关阅读:
    动态规划——Best Time to Buy and Sell Stock IV
    动态规划——Split Array Largest Sum
    动态规划——Burst Ballons
    动态规划——Best Time to Buy and Sell Stock III
    动态规划——Edit Distance
    动态规划——Longest Valid Parentheses
    动态规划——Valid Permutations for DI Sequence
    构建之法阅读笔记05
    构建之法阅读笔记04
    构建之法阅读笔记03
  • 原文地址:https://www.cnblogs.com/caogang/p/4379541.html
Copyright © 2011-2022 走看看