我现在已经能实现TreeSet、TreeMap、ArrayList中利用Comparable、Comaparator排序的了,但是在HashSet和HashMap中不能实现,怎么回事?高手指点代码如下:
package PaiXu;import java.util.HashSet;
import java.util.Iterator;public class HashSetPX {
public static void main(String[] args) {
HashSet<Student> hashSet = new HashSet<Student>();
Student student1 = new Student(1, "张三", 21, "c1");
Student student2 = new Student(2, "李四", 23, "c1");
Student student3 = new Student(3, "王五", 27, "c2");
Student student4 = new Student(4, "赵六", 25, "c3");
Student student5 = new Student(5, "田七", 20, "c1");
hashSet.add(student1);
hashSet.add(student2);
hashSet.add(student3);
hashSet.add(student4);
hashSet.add(student5);
Iterator<Student> iterator = hashSet.iterator();
while(iterator.hasNext()){
//Student student = iterator.next();
//System.out.println(student);
System.out.println(iterator.next());
}
}
}
-------------------------------------------------------------------------------
package PaiXu;
/**
* 编号,姓名,年龄,班级编号
* @author Administrator
*
*/
public class Student implements Comparable<Student>{
private int number;
private String name;
private int age;
private String classNo;
public int getNumber() {
return number;
}
public void setNumber(int number) {
this.number = number;
}
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;
}
public String getClassNo() {
return classNo;
}
public void setClassNo(String classNo) {
this.classNo = classNo;
}
public Student() {
super();
// TODO Auto-generated constructor stub
}
public Student(int number, String name, int age, String classNo) {
super();
this.number = number;
this.name = name;
this.age = age;
this.classNo = classNo;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + age;
result = prime * result + ((classNo == null) ? 0 : classNo.hashCode());
result = prime * result + ((name == null) ? 0 : name.hashCode());
result = prime * result + number;
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
final Student other = (Student) obj;
if (age != other.age)
return false;
if (classNo == null) {
if (other.classNo != null)
return false;
} else if (!classNo.equals(other.classNo))
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
if (number != other.number)
return false;
return true;
}
@Override
public String toString() {
// TODO Auto-generated method stub
return "学号:"+number+",姓名:"+name+",年龄:"+age+",班级编号:"+classNo;
}
public int compareTo(Student o) {
if(o!=null){
if(this.age<o.age){
return 1;
}else if(this.age>o.age){
return -1;
}else {
return 0;
}
}else {
return 0;
}
}
}
package PaiXu;import java.util.HashSet;
import java.util.Iterator;public class HashSetPX {
public static void main(String[] args) {
HashSet<Student> hashSet = new HashSet<Student>();
Student student1 = new Student(1, "张三", 21, "c1");
Student student2 = new Student(2, "李四", 23, "c1");
Student student3 = new Student(3, "王五", 27, "c2");
Student student4 = new Student(4, "赵六", 25, "c3");
Student student5 = new Student(5, "田七", 20, "c1");
hashSet.add(student1);
hashSet.add(student2);
hashSet.add(student3);
hashSet.add(student4);
hashSet.add(student5);
Iterator<Student> iterator = hashSet.iterator();
while(iterator.hasNext()){
//Student student = iterator.next();
//System.out.println(student);
System.out.println(iterator.next());
}
}
}
-------------------------------------------------------------------------------
package PaiXu;
/**
* 编号,姓名,年龄,班级编号
* @author Administrator
*
*/
public class Student implements Comparable<Student>{
private int number;
private String name;
private int age;
private String classNo;
public int getNumber() {
return number;
}
public void setNumber(int number) {
this.number = number;
}
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;
}
public String getClassNo() {
return classNo;
}
public void setClassNo(String classNo) {
this.classNo = classNo;
}
public Student() {
super();
// TODO Auto-generated constructor stub
}
public Student(int number, String name, int age, String classNo) {
super();
this.number = number;
this.name = name;
this.age = age;
this.classNo = classNo;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + age;
result = prime * result + ((classNo == null) ? 0 : classNo.hashCode());
result = prime * result + ((name == null) ? 0 : name.hashCode());
result = prime * result + number;
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
final Student other = (Student) obj;
if (age != other.age)
return false;
if (classNo == null) {
if (other.classNo != null)
return false;
} else if (!classNo.equals(other.classNo))
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
if (number != other.number)
return false;
return true;
}
@Override
public String toString() {
// TODO Auto-generated method stub
return "学号:"+number+",姓名:"+name+",年龄:"+age+",班级编号:"+classNo;
}
public int compareTo(Student o) {
if(o!=null){
if(this.age<o.age){
return 1;
}else if(this.age>o.age){
return -1;
}else {
return 0;
}
}else {
return 0;
}
}
}
如果要使用Set或Map集合,就不应该依赖其迭代器的顺序,因此也不需要为其内容进行排序。
可以用HashSet和HashMap的变种 LinkedHashSet,LinkedHashMap