关闭

黑马程序员——JAVA笔记——集合框架2——Set

标签: java黑马程序员
118人阅读 评论(0) 收藏 举报
分类:

------- android培训java培训、期待与您交流! ----------


|--Set:元素是无序的(存入和取出的顺序不一定一致),元素不可以重复,该集合中没有索引。
|--HashSet:底层数据结构是哈希表。
HashSet是如何保证元素唯一性的呢?
是通过元素的两个方法,hashCode和equals来完成。
如果元素的HashCode值相同,才会调用equals判断是否为true。
如果元素的HashCode值不同,不会调用equals。
注意,对于判断元素是否存在(contains),以及删除(remove)等操作,依赖的方法是元素的hashCode和equals方法。
|--TreeSet:

例:往HashSet集合中存入自定义对象,姓名和年龄相同为同一个人,重复元素。

class Demo
{
	public static void main(String[] args)
	{
		HashSet hs=new HashSet();
		hs.add(new Person("a1",11));
		hs.add(new Person("a2",12));
		hs.add(new Person("a3",13));
//		hs.add(new Person("a2",12));

//		System.out.println("contains:"+hs.contains(new Person("a1",11)));
		
		System.out.println("remove:"+hs.remove(new Person("a3",13)));
		
		Iterator it=hs.iterator();
		
		while(it.hasNext())
		{
			Person p = (Person)it.next();
			System.out.println(p.getName()+"--"+p.getAge());
		}
	}
}

class Person
{
	private String name;
	private int age;

	public int hashCode()
	{
		System.out.println(name+"....hashCode");
		return name.hashCode()+age;//*39
	}
	
	public boolean equals(Object obj)
	{
		if(!(obj instanceof Person))
			return false;
		Person p=(Person)obj;
		System.out.println(this.name+"..equals.."+p.name);
		return this.getName().equals(p.getName()) && this.getAge()==p.getAge();
	}
	
	Person(String name,int age)
	{
		this.name=name;
		this.age=age;
	}
	
	public int getAge() 
	{
		return age;
	}
	
	public void setAge(int age) 
	{
		this.age = age;
	}
	
	public String getName()
	{
		return name;
	}
	
	public void setName(String name)
	{
		this.name=name;
	}
	
}


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

TreeSet排序的第一种方式:让元素自身具备比较性,
元素需要实现Comparable借口,覆盖compareTo方法。这种方式也称为元素的自然顺序,或者叫默认顺序。

TreeSet的第二种排序方式:当元素自身不具备比较性时,或者具备的比较性不是所需要的。
这时就需要让集合自身具备比较性。在集合初始化时,就有了比较方式。


例(第一种方式):往TreeSet集合中存储自定义对象学生,按照学生的年龄进行排序。
记住,排序时,当主要条件相同时,一定要判断次要条件。

class Demo
{
	public static void main(String[] args)
	{
		TreeSet ts=new TreeSet();
		ts.add(new Student("lisi02",22));
		ts.add(new Student("lisi007",20));
		ts.add(new Student("lisi09",19));
		ts.add(new Student("lisi08",19));

		Iterator it=ts.iterator();
		while(it.hasNext())
		{
			Student stu=(Student)it.next();
			System.out.println(stu.getName()+"..."+stu.getAge());
		}

	}
}

class Student implements Comparable//该接口强制让学生具备比较性
{
	private String name;
	private int age;
	
	public int compareTo(Object obj)
	{
		if(!(obj instanceof Student))
			throw new RuntimeException("不是学生对象");
		Student s=(Student)obj;
		
		System.out.println(this.name+"..compareto.."+s.name);
		if(this.age>s.age)
			return 1;
		if(this.age==s.age)
		{
			return this.name.compareTo(s.name);
		}
		return -1;
	}
	
	Student(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;
	}
}

当元素自身不具备比较性,或者具备的比较性不是所需要的。
这时需要让容器自身具备比较性。定义一个比较器,将比较器对象作为参数传递给TreeSet集合的构造函数。
当两重排序都存在时,以比较器为主。

例(第二种方式):定义一个类,实现Comparator借口,覆盖compare方法。以return 0判断元素是否相同。

class Demo
{
	public static void main(String[] args)
	{
		TreeSet ts=new TreeSet(new MyCompare());
		ts.add(new Student("lisi02",22));
		ts.add(new Student("lisi007",20));
		ts.add(new Student("lisi09",19));
		ts.add(new Student("lisi06",18));
		ts.add(new Student("lisi007",29));

		Iterator it=ts.iterator();
		while(it.hasNext())
		{
			Student stu=(Student)it.next();
			System.out.println(stu.getName()+"..."+stu.getAge());
		}

	}
}

class MyCompare implements Comparator
{
	public int compare(Object o1,Object o2)
	{
		Student s1=(Student)o1;
		Student s2=(Student)o2;
		
		int num = s1.getName().compareTo(s2.getName());
		if(num==0)
		{
			return new Integer(s1.getAge()).compareTo(new Integer(s2.getAge()));
		}
		return num;
	}
}

class Student implements Comparable//该接口强制让学生具备比较性
{
	private String name;
	private int age;
	
	public int compareTo(Object obj)
	{
		if(!(obj instanceof Student))
			throw new RuntimeException("不是学生对象");
		Student s=(Student)obj;
		
//		System.out.println(this.name+"..compareto.."+s.name);
		if(this.age>s.age)
			return 1;
		if(this.age==s.age)
		{
			return this.name.compareTo(s.name);
		}
		return -1;
	}
	
	Student(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;
	}
}


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:3314次
    • 积分:265
    • 等级:
    • 排名:千里之外
    • 原创:24篇
    • 转载:0篇
    • 译文:0篇
    • 评论:2条
    文章分类
    文章存档
    最新评论