package org.example.testBinary;
import com.google.common.collect.Lists;
import java.util.List;
public class Main {
public static void main(String[] args) {
List<Integer> rankList = Lists.newArrayList(11, 9, 7, 5, 3, 1);
int index = binarySearch(rankList, 10);
System.out.println(index);
}
/**
* 返回自己的排名,第一名返回的是1(而不是0)
*
* @param rankList
* @param des
* @return
*/
public static int binarySearch(List<Integer> rankList, Integer des) {
// 榜单为空,返回1
if (rankList.isEmpty()) {
return 1;
}
// 比最后一名还小,返回的是N+1
if (des <= rankList.get(rankList.size() - 1)) {
return rankList.size() + 1;
}
// 第一名返回的是1,不是0
if (des > rankList.get(0)) {
return 1;
}
// 下面是查找下大致的位置,有可能自己曾经在榜单上
int start = 0;
int end = rankList.size() - 1;
while (start <= end) {
int mid = (end + start) >>> 1;
if (des > rankList.get(mid)) {
end = mid - 1;
} else {
start = mid + 1;
}
}
// start一定是大于end的
return start + 1;
}
}
所以,游戏中的排行榜,必然要求是:按照降序来的。
所以,集合框架中的,是不满足的。
里面重写了排序算法。
这个所谓的二分查找,是返回自己在排行中的位置(从1开始),而且,就算自己不在list上,也是会返回位置的。重复时,默认认为是自己更小。