黑马程序员--java基础之类集框架(二)
Set集合:是一个无序的但不重复的容器
练习一:在HashSet中存入自定义元素,要求名字和年龄相同则为重复元素,不能存入;
提示:1、自定义类中必须复写equals方法和hashCode方法,因为集合中保证元素不重复的判断依据是:先判断元素的hashCode值,然后才判断元素的内容;
2、与LinkedList的区别是多复写一个hashCode方法;
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
|
class Person{ private String name; private int age; Person(String name, int age){ this.name = name; this.age = age; } public int hashCode(){ return this.name.hashCode() + age; } public boolean equals(Object obj){ if(!(obj instanceof Person)) return false; Person p = (Person)obj; return this.name.equals(p.name) && this.age == p.age; } public String getName(){ return name; } public int getAge(){ return age; }}class SetTest{ public static void main(String [] args){ HashSet hs = new HashSet(); hs.add(new Person("zhangsan01", 21)); hs.add(new Person("zhangsan02", 22)); hs.add(new Person("zhangsan02", 22)); hs.add(new Person("zhangsan03", 23)); hs.add(new Person("zhangsan04", 24)); Iterator it = hs.iterator(); while(it.hasNext()){ Person p = (Person)it.next(); System.out.println(p.getName()+"----"+p.getAge()); } }} |
练习二:在TreeSet中存入自定义元素,要求不能有重复;
提示:1、自定义类的时候要实现Comparable接口,并复写comparaTo方法,该方法中将obj向下转型,然后判断条件返回整数;
2、与LinkedList的区别是该列表需要复写equals方法;
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
|
class SetTest{ public static void main(String [] args){ TreeSet ts = new TreeSet(); ts.add(new Student("zhangsan01", 21)); ts.add(new Student("zhangsan02", 22)); ts.add(new Student("zhangsan03", 23)); ts.add(new Student("zhangsan03", 23)); ts.add(new Student("zhangsan04", 24)); Iterator it = ts.iterator(); while(it.hasNext()){ Student st = (Student)it.next(); System.out.println(st.getName()+ "---"+ st.getAge()); } }}class Student implements Comparable{ private String name; private int age; Student(String name, int age){ this.name = name; this.age = age; } public int compareTo(Object obj){ if(!(obj instanceof Student)) throw new ClassCastException("对象不是学生"); Student stu = (Student)obj; if(this.age > stu.age) return 1; if(this.age == stu.age){ return this.name.compareTo(stu.name); } return -1; } public String getName(){ return name; } public int getAge(){ return age; }} |
练习三:练习二的升级版,定义一个新的比较器,用名字作为主要判断条件进行比较
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
|
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; }}class myComparator implements Comparator{ public int compare(Object obj1, Object obj2){ Student st1 = (Student)obj1; Student st2 = (Student)obj2; int num = st1.getName().compareTo(st2.getName()); if(num == 0){ return new Integer(st1.getAge()).compareTo(new Integer(st2.getAge())); } return num; }}class SetTest{ public static void main(String [] args){ TreeSet ts = new TreeSet(new myComparator()); ts.add(new Student("zhangsan03", 26)); ts.add(new Student("zhangsan01", 21)); ts.add(new Student("zhangsan05", 22)); ts.add(new Student("zhangsan03", 23)); ts.add(new Student("zhangsan03", 23)); ts.add(new Student("zhangsan04", 24)); Iterator it = ts.iterator(); while(it.hasNext()){ Student st = (Student)it.next(); System.out.println(st.getName()+ "---"+ st.getAge()); } }} |
练习四:自定义比较器,按照字符串的长度进行排序
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
class SetTest{ public static void main(String [] args){ TreeSet ts = new TreeSet(new myComparator()); ts.add("abd"); ts.add("abc"); ts.add("abdc"); ts.add("g"); ts.add("werer"); ts.add("ui"); Iterator it = ts.iterator(); while(it.hasNext()){ System.out.println(it.next()); } }}class myComparator implements Comparator{ public int compare(Object obj1, Object obj2){ String s1 = (String)obj1; String s2 = (String)obj2; int num = new Integer(s1.length()).compareTo(new Integer(s2.length())); if(num == 0){ return s1.compareTo(s2); } return num; }} |

浙公网安备 33010602011771号