本题要点共两个:要点实现:比较器复习:
比较器的返回值两个比较器 Comparator 和 Comparable
解题代码:
1356. 根据数字二进制下 1 的数目排序 - 力扣(LeetCode) (leetcode-cn.com)
- 二进制下1的数目。设置比较器,当1的个数相等时按照原数值进行排序。
- bit[i] = bit[i >> 1] + (i & 1); 表示 i 的二进制中 1 的数量 ,通过 容器new int[10001] 将 本题所有数 的1的数量记载出来。通过比较器实现排序 Collections.sort(l, new Comparator
comparator反应两个参数的权重。1是前者权重大,-1是后者。最后按照权重由小到大排序。 o1=4, o2=6, 若返回1表示 前者4权重大,4排在后面。 负数: 前者 < 后者 0: 两者相等 正数: 前者 > 后者两个比较器 Comparator 和 Comparable
相同点: 是java的一个接口, 并且是用来对自定义的类(class)比较大小的
不同点:
Comparable 定义在 Person类的内部:
public class Student implements Comparable{
@Override
public int compareTo(Object o) {
return 0;
}
}
List list=new ArrayList(10);
使用方法:Collections.sort(list);
Comparator 是定义在Person的外部的
·public class Person{ String name; int age },·
public PersonComparator implements Comparator() {..比较Person的大小..},
public class StudentComparator implements Comparator {
@Override
public int compare(Object o1, Object o2) {
return 0;
}
}
List list=new ArrayList(10);
使用方法:Collections.sort(t,new StudentComparator());
解题代码:
public int[] sortByBits(int[] arr) {
int[] bit = new int[10001];
List l = new ArrayList<>();
for (int i : arr) {
l.add(i);
}
for (int i = 0; i < bit.length; i++) {
// bit[i]= bit[i>>2] + (i & 3); 不成立
bit[i] = bit[i >> 1] + (i & 1);
}
Collections.sort(l, new Comparator() {
@Override
public int compare(Integer o1, Integer o2) {
if(bit[o2]>bit[o1]){
return -1;
}else if(bit[o2]==bit[o1]){
return o1-o2;
}else{
return 1;
}
}
});
int i =0;
for (Integer integer : l) {
arr[i++] = integer;
}
return arr;
}



