您的位置:首页 > 职场人生

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

2015-07-07 23:37 706 查看
-------
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 黑马程序员