今天在做项目时,遇到需要将联系人列表进行排序的问题,联系人列表中有中文,也有英文,而且是通过List<UserItem>的集合,借助Adapter对象展现在listView中。通过查询资料,决定使用Collection(list,Comparator<T>)这个方法进行排序,还有一个必须注意的是,必须重写User的toString()方法,否则比较的是它们的内存地址,下面是我的代码:
Comparator类:
public class MyComparator implements Comparator<Object>{
@Override
public int compare(Object o1, Object o2) {
User User1=(User)o1;
User User2=(User)o2;
Collator collator=Collator.getInstance();
//把字符串转换为一系列比特,它们可以以比特形式与 CollationKeys 相比较
CollationKey key1=collator.getCollationKey(o1.toString());//要想不区分大小写进行比较用o1.toString().toLowerCase()
CollationKey key2=collator.getCollationKey(o2.toString());
return key1.compareTo(key2);
}
}
User类:
public class User implements Serializable{
/**
*
*/
private static final long serialVersionUID = 3839176358397765336L;
private int id;
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
// TODO Auto-generated method stub
return this.name;
}
}
Test类:
public class Test {
public static void main(String[] args) {
List<User> list=new ArrayList<User>();
User user=new User();
user.setName("张三");
user.setId(0);
list.add(user);
User user2=new User();
user2.setName("利斯");
user2.setId(1);
list.add(user2);
User user3=new User();
user3.setName("z三");
user3.setId(3);
list.add(user3);
User user4=new User();
user4.setName("徐斯");
user4.setId(4);
list.add(user4);
User user5=new User();
user5.setName("牛三");
user5.setId(6);
list.add(user5);
User user6=new User();
user6.setName("常斯");
user6.setId(7);
list.add(user6);
User user7=new User();
user7.setName("m三");
user7.setId(8);
list.add(user7);
User user8=new User();
user8.setName("a斯");
user8.setId(9);
list.add(user8);
User user9=new User();
user9.setName("阿斯");
user9.setId(9);
list.add(user9);
User user10=new User();
user10.setName("c斯");
user10.setId(9);
list.add(user10);
User user11=new User();
user11.setName("比斯");
user11.setId(9);
list.add(user11);
User user12=new User();
user12.setName("c斯");
user12.setId(9);
list.add(user12);
User user13=new User();
user13.setName("伯斯");
user13.setId(9);
list.add(user13);
Collections.sort(list, new MyComparator());
System.out.println(list.toString());
}
}
最终得到排序的结果:
[a斯, c斯, c斯, m三, z三, 阿斯, 比斯, 伯斯, 常斯, 利斯, 牛三, 徐斯, 张三]
字母开头的均排在了前面,汉字开头的均列在了后面,目前,这种排序方式是可以满足业务要求的