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

原创 2015年07月07日 23:37:15

------- 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;
	}
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

黑马程序员——JAVA基础------集合框架(二)----Set接口

——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——一、Set接口1 、 Set 接口public interface Set extends Collection一 ...

黑马程序员——Java集合框架—Set

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

黑马程序员——java基础拾遗之集合框架(一) List 和 Set

集合类:方便对多个对象进行操作,存储等。 和数组的区别 数组的长度固定,集合的长度可变,数组可以存储基本数据类型,集合只能存对象 数组存内容的类型必须相同,集合类可以存储不同类型的对象 ...

黑马程序员_JAVA笔记14——集合框架(List、HashSet、TreeSet)

------- android培训、java培训、期待与您交流! ---------- 1、为什么出现集合类,面向对象语言对事物的体现都是以对象的形式,所以为了方便对多个对象的操作,就对对象进行存储...

黑马程序员——Java学习笔记 集合框架(二)

class HashSetTest {     public static void sop(Object obj)      //打印方法     {     ...

黑马程序员——Java学习笔记 集合框架(一)

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

【黑马程序员】集合框架(上)——Java复习笔记

——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-List的子类(1)ArrayList (2)Vector 特有功能 a:添加 ...

黑马程序员java学习笔记——集合框架

集合框架     概述     面向对象语言对事物的描述都是以对象的形式体现的,为了方便对多个对象的操作,就对对象进行存储,集合就是存处对象最常用的一种方式,数据多了用对象存,对象多了就用集合存。...

黑马程序员——JAVA笔记之集合框架(泛型、Map等)

集合框架(泛型、Map等) 面向对象语言对事物的体现都是以对象的形式,所有未来方便对多个对象的操作,就对对象进行存储,集合就是存储对象最常用的一种方式。 数组虽然也可以存储对象,但长度是固定的;集合...

黑马程序员_JAVA笔记15——集合框架(泛型)

------- android培训、java培训、期待与您交流! ---------- 1、泛型:JDK1.5后出现的新特性,用于解决安全问题,是一个安全机制。 好处:         将运行时...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)