我现在已经能实现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;
}
}
 
}

解决方案 »

  1.   

    Set和Map本来就不是有序的
    如果要使用Set或Map集合,就不应该依赖其迭代器的顺序,因此也不需要为其内容进行排序。
      

  2.   

    如果一定要排序
    可以用HashSet和HashMap的变种 LinkedHashSet,LinkedHashMap
      

  3.   

    意思说HashSet、HashMap不能排序吗?
      

  4.   

    Set和Map不是有序的,HashSet、HashMap也没有顺序
      

  5.   

    LinkedHashSet , LinkedHashMap
      

  6.   

    很简单,你需要重写里面的一个比较方法,具体叫什么,我一下子想不起了,你google一下把,
      

  7.   

    不好意思,我没有看完你的帖子,我说错了,hashSet与HashMap,如其名一样,是散列的,直接用不能够排序把!!