compareTo
- 源码
public int compareTo(String anotherString) {
int len1 = value.length;
int len2 = anotherString.value.length;
int lim = Math.min(len1, len2);
char v1[] = value;
char v2[] = anotherString.value;
int k = 0;
while (k < lim) {
char c1 = v1[k];
char c2 = v2[k];
if (c1 != c2) {
return c1 - c2;
}
k++;
}
return len1 - len2;
}
- 分析
1.首先获取到两个字符串转为char数组后的长度,选出小的那个当做界值
2.开始遍历比较两个char数组,比较同一坐标下两个字符的十进制值,如果不相等,就进行运算,把两个字符的差值进行运算,并返回,如果相等,下标值递增,继续循环。
3.如果遍历结束,已经超出界值,就把两个char数组的长度相减后的值作为返回值
实例
List<String> list = new ArrayList<>();
list.add("asd");
list.add("bsd");
list.add("csd");
list.add("dsd");
list.add("esd");
list.add("fsd");
Collections.sort(list, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
String s1 = String.valueOf(o1);
String s2 = String.valueOf(o2);
return s1.compareTo(s2);
}
});
Comparator接口
上面比较的是基础类,如果是自定义类的话,可以自定义比较条件
List<User> listUser = new ArrayList<>();
listUser.add(new User("ZHANGSAN",15));
listUser.add(new User("LISI",19));
listUser.add(new User("WANGWU",16));
Collections.sort(listUser, new Comparator<User>() {
@Override
public int compare(User o1, User o2) {
/**
* 按照年龄来排序
*/
//return o1.getAge()-o2.getAge(); 正序
return o2.getAge()-o1.getAge();//倒序
}
});
System.out.println(listUser);
Collections.sort(listUser, new Comparator<User>() {
@Override
public int compare(User o1, User o2) {
/**
* 按照名字来排序 (在Unicode编码里)
*/
//return o1.getAge()-o2.getAge(); 正序
return o2.getName().compareTo(o1.getName());//倒序
}
});
System.out.println(listUser);
Collections.sort(listUser, new Comparator<User>() {
@Override
public int compare(User o1, User o2) {
return 0;
}
});
System.out.println(listUser);