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

黑马程序员------集合Set

2013-05-15 10:03 260 查看
 ------- android培训java培训、期待与您交流! ----------

hash_set类是外部STL中的类,用于向收集器中存储或快速检索数据。收集器中的这些数据唯一,且数值充当关键字。

HashSet 哈希 通过Hashcode 哈希码来分辨存储

举例说明:

import java.util.*;

/*

* 用HasSet 存储自定义对象

* 人 有姓名 年龄属性 有重复元素

* */

class Person

{

private String name;

private int age;

Person(String name, int age)// 重写构造方法

{

this.name = name;

this.age = age;

}

public int hashCode()//这里需要重写hasCode方法

{

System.out.println(this.name + "......hashCode");//这里只为了说明hashCode算好后比较

//return 60;//因为hashcode都不一样所以返回个同样的

return name.hashCode() + age;//String 有自己的hashCode值 用这个作比较,可以减少次数比较

//return name.hashCode() + age*37; 为什么乘37,因为两个相加可能和其他两个数相加一样

}

public boolean equals(Object obj)

{

if(!(obj instanceof Person))//instanceof 判断其左边对象是否为其右边类的实例

{

return false;

}

Person p = (Person)obj;//强制转换

System.out.println(this.name + "....equals.." + p.name);//是否进行equals方法

return this.name.equals(p.name) && this.age == p.age;

}

public String getName()

{

return name;

}

public int getAge()

{

return age;

}

}

public class HasSetDemo

{

public static void sop(Object obj)

{

System.out.println(obj);

}

public static void main(String[] arg)

{

HashSet hs = new HashSet();

hs.add(new Person("wangwu01",22));

hs.add(new Person("wangwu02",23));

hs.add(new Person("wangwu02",23));//这个是重复的元素

hs.add(new Person("wangwu03",24));

hs.add(new Person("wangwu04",25));

Iterator it = hs.iterator();

while(it.hasNext())

{

//sop(it.next());//这里打印的是存入的hashcode码 每一个都不一样,要分辨是否同意个人需要equals方法

Person p = (Person)it.next();//强制转换

sop(p.getName()+"......" + p.getAge());//这是按照Hashcode排序的

}

}

}


**************************************************************************************************************************************************************************************

TreeSet 二叉树结构

import java.util.*;
import java.lang.*;
/*
* 实现在容器TreeSet中存入自定义对象
*
* 比如存个学生  学生有姓名年龄属性 并按照年龄进行排序
* */

public class TreeSetDemo
{
public static void sop(Object obj)
{
System.out.println(obj);
}

public static void main(String[] args)
{
TreeSet ts = new TreeSet();
ts.add(new Student("lisi02",22));//只能存入一个,因为不知道用什么进行比较排序
ts.add(new Student("lisi007",27));
ts.add(new Student("lisi05",28));
ts.add(new Student("lisi09",21));
//ts.add(new Student("lisi10",21));如果在这里添加年龄一样的不一样的学生则会添加失败用if的方式

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;
Student(String name, int age)
{
this.name = name;
this.age = age;
}

public String getName()
{
return name;
}

public int getAge()
{
return age;
}

public  int compareTo(Object obj)//必须重写comparTo方法
{
if(!(obj instanceof Student))
throw new RuntimeException("不是学生对象");

Student s = (Student)obj;
if(this.age > s.age)
return 1;
if(this.age == s.age)
return this.name.compareTo(s.name);//如果年龄相同再比较姓名 用的String的 compareTo方法
return -1;

/*if(this.age > s.age)用if的方式 添加同样的年龄不同的人则会添加失败  只判断了年龄是否相同
return 1;
if(this.age == s.age)
return 0;
return -1;
*/
}
}


import java.util.*;

/*
* 需求: 按照字符串长度排序
* 字符串本身具备比较性,但是不是所需要的,需要按照长度排序。
* 这时就需要使用比较器
*
* */
public class TreeSetDemo2
{
public static void sop(Object obj)
{
System.out.println(obj);
}

public static void main(String[] args)
{
TreeSet ts = new TreeSet(new StrLenComparator());
ts.add("aabc");
ts.add("asd");
ts.add("aaa");
ts.add("ddas");
ts.add("sd");
ts.add("sdfff");

Iterator it = ts.iterator();
while (it.hasNext())
{
sop(it.next());
}
}

}

class StrLenComparator implements Comparator
{
public int compare(Object o1, Object o2)
{
String s1 = (String)o1;
String s2 = (String)o2;

int num = new Integer(s1.length()).compareTo(new Integer(s2.length()));
if(num == 0)
{
return s1.compareTo(s2);
}
return num;

/*if(s1.length() > s2.length())这里同样的如果用这种方式 长度相同的不同单词就没有添加进去
return 1;
if(s1.length() == s2.length())
return 0;
return -1;
*/

}
}


这里的比较器 使用的强转 方式不好 后面将会介绍泛型 就不用强转了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: