java的Collection或Map如何使他们里面的元素自动排序呢,
虽然是老早学习的java内容了,想不到面试官也稍微问了我一下,那时候没复习到这,只是答一半漏一半。
现在做个备忘。
* 需求:
* 往自定义集合中存入对象,按先年龄后姓名的从小到大的方式排序。
*
* 思路:
* 方法一:需要通过对象所在类实现Comparable接口,再复写其中compareTo方法
* 方法二:当元素自身不具备比较性,或者具备的比较性不是所需要的,可使用比较器Comparator
* 覆盖里面的compare方法。
*
* 此示范中两种方法都包含了*/
import java.util.*;
/*
public class TreeSetTest {
public static void main(String[] args) {
TreeSet ts = new TreeSet();
ts.add("adcd");
ts.add("accd");
ts.add("Adcd");
Iterator it = ts.iterator();
while(it.hasNext())
System.out.println(it.next());
}
}
*/
public class TreeSetTest {
public static void main(String[] args) {
TreeSet ts = new TreeSet(new MyCompare());
ts.add(new Teacher("lisi01",11));
ts.add(new Teacher("lisi02",12));
ts.add(new Teacher("lisi03",13));
ts.add(new Teacher("lisi03",11));
ts.add(new Teacher("lisi01",11));
Iterator it = ts.iterator();
while(it.hasNext()) {
Teacher t =(Teacher)it.next();
System.out.println(t.getName()+":::"+t.getAge());
}
}
}
class MyCompare implements Comparator { //方法二:排序:先姓名后年龄。
public int compare(Object o1,Object o2) {
Teacher t1 = (Teacher)o1;
Teacher t2 = (Teacher)o2;
int num = t1.getName().compareTo(t2.getName());
if(num==0) {
/*
if(t1.getAge()>t2.getAge())
return 1;
if(t1.getAge()==t2.getAge())
return 0;
else
return -1;
*/
//因为整数也有自己的比较方法,可以用以下方法替代上面方法。
return new Integer(t1.getAge()).compareTo(new Integer(t2.getAge()));
//此处将整数类型封装成Integer对象得以调用compareTo方法。
}
return num;
}
}
class Teacher implements Comparable {
private String name;
private int age;
private Teacher s;
Teacher(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) { //方法一:排序:先年龄后姓名
if(!(obj instanceof Teacher))
throw new RuntimeException("该对象不是老师");
else
s = (Teacher)obj;
if(this.age>s.age)
return 1;
else if(this.age==s.age)
return this.name.compareTo(s.name); //此处调用compareTo方法是字符串原有的。
else
return -1;
}
}