Java学习笔记_22_Set接口的实现类(二)

2014-11-23 21:25:44 · 作者: · 浏览: 23
nt implements Comparable { // 创建属性 private Integer age; private String name; // 包含参数的构造函数 public Student(Integer age, String name) { this.age = age; this.name = name; } // 生成属性的get和set方法 public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } // 重写toString方法 public String toString() { return "age :" + age + " name :" + name; } // 重写HashCode方法 public int hashCode() { return age * name.hashCode(); } // 重写equals方法 public boolean equals(Object obj) { Student s = (Student) obj; return age == s.age && name.equals(s.name); } //重写compareTo(Object o)方法 public int compareTo(Object o) { Student s = (Student) o; if (s.getAge().compareTo(this.getAge()) > 0) return -1; else if (s.getAge().compareTo(this.age) == 0) return 0; else return 1; } }

TestTreeSet类中的代码:

import java.util.Iterator;
import java.util.Set;
import java.util.TreeSet;

public class TestTreeSet {
	public static void main(String[] args) {
		// 创建一个LinkedHashSet集合对象
		Set
  
    ts = new TreeSet
   
    (); // 生成一些Student对象 Student sd1 = new Student(18, "zxx"); Student sd2 = new Student(23, "abc"); Student sd3 = new Student(25, "hik"); Student sd4 = new Student(25, "hik"); Student sd5 = new Student(17, "cde"); // 向集合对象中添加Student对象 lhs.add(sd4); ts.add(sd2); ts.add(sd5); ts.add(sd3); ts.add(sd1); // 生成一个迭代器 Iterator
    
      it = ts.iterator(); // 输出字符串 while (it.hasNext()) { System.out.println(it.next()); } } }
    
   
  

输出结果:

age :17 name :cde

age :18 name :zxx

age :23 name :abc

age :25 name :hik

很明显TreeSet中的Student类按age由小到大的顺序排序。

使用Comparable接口可以完成TreeSet的排序,但使用Comparable接口定义排序具有局限性,实现此接口的类只能按CompareTo()定义

的这一种方法排序。如果同一类对象要有多种排序方式,应该为该类定义不同的比较器。

定义比较器实际上就是让自编写的类实现Comparator接口,重写Comparator接口中的比较方法compare(Object a,Object b)。

排序Student集合类例子:

Student中的代码:

public class Student {
	// 创建属性
	private Integer age;
	private String name;
	private Integer score;

	// 包含参数的构造函数
	public Student(Integer age, String name, Integer score) {
		this.age = age;
		this.name = name;
		this.score = score;
	}

	// 重写toString方法
	public String toString() {
		return "name :" + name + " age :" + age + " score :" + score;
	}

	// 生成属性的get和set方法
	public Integer getAge() {
		return age;
	}

	public void setAge(Integer age) {
		this.age = age;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public Integer getScore() {
		return score;
	}

	public void setScore(Integer score) {
		this.score = score;
	}

	// 重写HashCode方法
	public int hashCode() {
		return age * score * name.hashCode();
	}

	// 重写equals方法
	public boolean equals(Object obj) {
		Student s = (Student) obj;
		return age == s.age && name.equals(s.name)
                && score == s.score;
	}
 }

TestTreeSet类中的代码:

import java.util.Comparator;
import java.util.Iterator;
import java.util.Set;
import java.util.TreeSet;

//学生年龄比较器
class StudentAgeComparator implements Comparator
  
    {
	public int compare(Student o1, Student o2) {
		int i = o1.getAge() - o2.getAge();
		return i;
	}
}

// 学生成绩比较器
class StudentScoreComparator implements Comparator
   
     { public int compare(Student o1, Student o2) { int i = o1.getScore() - o2.getScore(); return i; } } public class TestTreeSet {