黑马程序员------集合Set
2013-05-15 10:03
260 查看
------- android培训、java培训、期待与您交流! ----------
hash_set类是外部STL中的类,用于向收集器中存储或快速检索数据。收集器中的这些数据唯一,且数值充当关键字。
HashSet 哈希 通过Hashcode 哈希码来分辨存储
举例说明:
**************************************************************************************************************************************************************************************
TreeSet 二叉树结构
这里的比较器 使用的强转 方式不好 后面将会介绍泛型 就不用强转了
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; */ } }
这里的比较器 使用的强转 方式不好 后面将会介绍泛型 就不用强转了
相关文章推荐
- 黑马程序员——第15天——(API)集合框架(TreeSet,泛型)
- 黑马程序员-集合类Collection之Set接口
- 黑马程序员——Java基础---集合(Set接口及其子类、Map接口及其子类)
- 黑马程序员--集合(List和Set)
- 黑马程序员_集合之Set(HashSet与TreeSet)
- 黑马程序员——Set集合概述及特点
- 黑马程序员-JAVASE入门(集合Set)
- 黑马程序员——JAVA笔记——集合框架2——Set
- 黑马程序员---集合(三)---Set派系
- 黑马程序员--java集合Set
- AdaultBird--我的黑马程序员之路!Chapter3---多线程同步,同步唤醒和等待,守护线程,String类,基本数据类型包装类,集合框架中的List和Set
- 黑马程序员——6.集合类(String/StringBuffer、List、Set、Map、Collections工具类、Arrays工具类 )
- 黑马程序员---Java基础---Set集合
- 黑马程序员-集合(Set)
- 黑马程序员_java_集合框架_Collection_List_Set_Map_泛型
- 黑马程序员--07.集合框架--05.【集合Set】【哈希表】
- 黑马程序员_专题:集合复习(Collect,List,Set的区别)
- 黑马程序员:Java基础——Set集合之TreeSet
- 黑马程序员--集合之HashSet/TreeSet原理
- 黑马程序员java学习—集合框架List和Set