码迷,mamicode.com
首页 > 其他好文 > 详细

集合框架-Set

时间:2016-05-24 19:21:15      阅读:163      评论:0      收藏:0      [点我收藏+]

标签:set   treeset   hashser   

集合框架

Collection

    |--List 有序可重复,有索引,存入的顺序和取出的顺序一致

        |--Arraylist--数组结构,查询速度快,不同步  

        |--linkedlist--链表结构,增删速度快,不同步

    |--Set 无序不重复   

        |--Hashset--哈希表结构,元素唯一,查询速度快,不同步  

        |--Treeset--二叉树结构,可以对set集合中的元素排序,不同步

                Treeset排序两种方式,自然排序:元素实现Comaprable接口,覆盖compareTo()

                                    比较器排序:容器传入实现Comparator接口的比较器,覆盖compare()




Set:元素不能重复,没有顺序。

    Set中的方法和Collection中的一致。


HashSet

	@Test
	public void test7(){
		//创建一个hashSet集合。
		HashSet hs = new HashSet();
		
		hs.add("cba");
		hs.add("nba");
		hs.add("nba");
		hs.add("nba");
		hs.add("haha");
		hs.add("abcd");
		hs.add("haha3");

//		System.out.println("ab".equals("ab"));
//		System.out.println("ab".hashCode());
		
		for(Iterator it = hs.iterator(); it.hasNext(); ){
			System.out.println(it.next());
		}
	}

	打印结果:无序,不重复
	    haha3
            cba
            nba
            haha
            abcd


HashSet存储自定义对象

    HashSet集合判断元素是否相同,依据元素的 hashCodeequals方法。

	@Test
	public void test07(){
		HashSet hs = new HashSet();
		Person p = new Person("hahahha",33);
		hs.add(p);
		hs.add(new Person("hahahha",33));
		hs.add(new Person("hahahha",33));
		hs.add(new Person("hahahha",33));
		for(Iterator it = hs.iterator(); it.hasNext(); ){
			System.out.println(it.next());
		}
	}
	
	测试结果:
	    cn.collection.Person@28f5662f
public class Person {

	private String name;
	private int age;
	 public Person(String name,int age){
		 this.name = name;
		 this.age = age;
		 //System.out.println(name+"  "+age);
	 }	 
	 
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + age;
		result = prime * result + ((name == null) ? 0 : name.hashCode());
		return result;
	}
	 
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Person other = (Person) obj;
		if (age != other.age)
			return false;
		if (name == null) {
			if (other.name != null)
				return false;
		} else if (!name.equals(other.name))
			return false;
		return true;
	}	 
}


TreeSet

    TreeSet集合判断元素相同,依据元素的compareTo方法或者 compare方法的return 0;


TreeSet排序有两种方式:

    第一种:让元素自身具备比较性。让元素对象实现Comparable口,覆盖compareTo方法。

    第二种:让容器具备比较性。其实就是定义一个比较器,就是实现Comparator接口,覆盖compare方法。将比较器以参数的形式传入构造方法中。

    第二种排序方法的优先级大于第一种排序方法!!


举例子

第一种排序方式,元素自身具备比较性

    conpareTo方法返回值的意思

            return=1;//实现有序 。存入顺序和取出顺序一致。一般不用。

            return=-1;//存入的顺序与取出的顺序相反

            return=0;//只能往TreeSet中存入一个数进去,其他的数存不进去


public class Person implements Comparable{
	private String name;
	private int age;
	public Person(String name,int age){
            this.name = name;
	    this.age = age;
	 }	
	  
	@Override
	public int compareTo(Object o) {
		if(!(o instanceof Person)){
			throw new ClassCastException("类型错误");
		}
		Person p = (Person)o;
	        
	        //通过年龄进行比较。如果年龄相同,必须再次比较次要条件姓名。
		return this.age-p.age==0?this.name.compareTo(p.name):this.age-p.age;

	}
            
	@Override
	public String toString() {
		return "Person [name=" + name + ", age=" + age + "]";
	}	 
}

测试
	@Test
	public void test08(){
		TreeSet ts =  new TreeSet();
		ts.add(new Person("zhang",32));
		ts.add(new Person("zhang",31));
		ts.add(new Person("zhang",33));
		ts.add(new Person("zhang",33));
		ts.add(new Person("asd",33));
		for(Iterator it = ts.iterator();it.hasNext();){
			System.out.println(it.next());
		}
	}
	
测试结果:
    Person [name=zhang, age=31]
    Person [name=zhang, age=32]
    Person [name=asd, age=33]
    Person [name=zhang, age=33]


第二中排序方式:让容器具备比较性

测试
	@Test
	public void test09(){
		TreeSet ts =  new TreeSet(new Comparator() {
			@Override
			public int compare(Object o1, Object o2) {
				// 根据Person的姓名进行比较,如果姓名相同,再次比较年龄。
				
				Person p1 = (Person)o1;
				Person p2 = (Person)o2;
				int temp = p1.getName().compareTo(p2.getName());
				return temp==0?p1.getAge()-p2.getAge():temp;
			}
		});
		ts.add(new Person("des",36));
		ts.add(new Person("zhang",31));
		ts.add(new Person("zhang",33));
		ts.add(new Person("zhang",33));
		ts.add(new Person("asd",33));
		for(Iterator it = ts.iterator();it.hasNext();){
			System.out.println(it.next());
		}
	}

测试结果:
    Person [name=asd, age=33]
    Person [name=des, age=36]
    Person [name=zhang, age=31]
    Person [name=zhang, age=33]

普通javabean    
public class Person {
	private String name;
	private int age;
	 public Person(String name,int age){
		 this.name = name;
		 this.age = age;
	 }	 
	 

	public String getName() {
		return name;
	}


	public void setName(String name) {
		this.name = name;
	}


	public int getAge() {
		return age;
	}


	public void setAge(int age) {
		this.age = age;
	}

	@Override
	public String toString() {
		return "Person [name=" + name + ", age=" + age + "]";
	}	 
}


/*

 * 练习:对字符串进行长度排序。

 * 思路:

 * 字符串本身具备自然排序,但是不是需求所需要的。

 * 这时只能使用比较器。

 */

        @Test
	public void test10(){
	        //不传入比较器的TreeSet,是按照元素本身的排序方式排序
		TreeSet ts = new TreeSet(new Comparator(){
			
			@Override
			public int compare(Object o1, Object o2) {
				String s1 = (String)o1;
				String s2 = (String)o2;
				int temp = s1.length()-s2.length();
				return temp==0?s1.compareTo(s2):temp;
			}
			
		});
		 ts.add("nba");
		 ts.add("adaddd");
		 ts.add("aa");
		 ts.add("aa");
		 ts.add("zz");
		 ts.add("abc");
		 ts.add("haha");

		 for (Iterator it = ts.iterator(); it.hasNext();) {
				System.out.println(it.next());
		 }
	}
测试结果:元素唯一,并按照长度排序,长度一致按照字典排序
    aa
    zz
    abc
    nba
    haha
    adaddd




集合框架-LinkedHashSet

在哈希表基础上保证有,唯一

测试
        @Test
	public void test11(){
		HashSet hs = new LinkedHashSet();//元素唯一,有序。
		
		hs.add("abcd");
		hs.add("nba");
		hs.add("haha");
		hs.add("cba");
		hs.add("haha");
		
		for(Iterator it = hs.iterator(); it.hasNext(); ){
			System.out.println(it.next());
		}
	}
测试结果:
    abcd
    nba
    haha
    cba


集合框架-Set

标签:set   treeset   hashser   

原文地址:http://8477424.blog.51cto.com/8467424/1782586

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!