int[]不支持自定义排序,Integer[]才支持
原因是Comparator只支持泛型元素,而int不是一个对象。
因此int数组没办法倒序排序,当然可以先正序排序,再反转数组。
Arrays和Collections
- Arrays.sort()可以指定from和end,但是Collections.sort()不行


- 有
Collections.swap(),但是没有Arrays.swap()
循环体中可改变循环限制条件
测试实例
System.out.println("----while循环测试----");int i = 0;int limit = 4;System.out.println("初始状态:" + "i=" + i + " limit=" + limit);while (i < limit) {i += 4;limit += 2;System.out.println("i=" + i + " limit=" + limit);}System.out.println("while循环结束\n");System.out.println("----for循环测试----");i = 0;limit = 4;System.out.println("初始状态:" + "i=" + i + " limit=" + limit);for (; i < limit; i += 4) {limit += 2;System.out.println("i=" + i + " limit=" + limit);}System.out.println("for循环结束");
输出结果
----while循环测试----初始状态:i=0 limit=4i=4 limit=6i=8 limit=8while循环结束----for循环测试----初始状态:i=0 limit=4i=0 limit=6i=4 limit=8for循环结束
stream与sum
集合框架转为stream后并没有sum()方法
而数组转为stream后才有sum()方法
关于str.split(String regex)
在str中出现的regex,无论连续出现几次,都不会在结果中出现
String[] strs = ":::::".split(":");System.out.println(strs.length); // out: 0System.out.println(Arrays.toString(strs)); // out: []
str中连续的regex出现在字符串最前或最后时,切分结果中不会有空字符串,但是出现在字符串中间时,则会出现空字符串 ```java String[] result = “1:::”.split(“:”); System.out.println(result.length); // out: 1 System.out.println(Arrays.toString(result)); // out: [1]
result = “1…2”.split(“\.”); System.out.println(result.length); // out: 4 System.out.println(Arrays.toString(result)); // out: [1, , , 2]
<a name="ab1b9"></a>####<a name="zevTY"></a>#### 排序规则```java(o1, o2) -> o1 - o2 // 从小到大排序 & 小根堆(o1, o2) -> o1.compareTo(o2) // 从小到大排序 & 小根堆
String数组转int数组
int[] arr = Arrays.stream(strList).mapToInt(Integer::parseInt).toArray();
对象数组转List
Integer[] a = new int[len];
Arrays.fill(a, 1);
List<Integer> list = new ArrayList<>();
list.addAll(Arrays.asList(a));
int数组转List
int[] arr = new int[100];
List<Integer> list = Arrays.stream(arr).boxed().collect(Collectors.toList());
- boxed()将int类型转为Integer类型
List / Integer数组转int数组
List<Integer> list = new ArrayList<>();
...
int[] arr = list.stream().mapToInt(i -> i).toArray();
Integer[] arr = {1, 2, 3};
int[] newArr = Arrays.stream(arr).mapToInt(i->i).toArray();
int数组排序去重转Integer数组
Integer[] sortedArr = Arrays.stream(arr).boxed().distinct().sorted().toArray(Integer[]::new);
二分搜索边界
- 求最小满足值
若二分答案是求最小满足值,我们可以直接使用lowerBound。
- 答案的分布区间为:【不满足,最大不满足,最小满足,满足,…】
- 假定答案区间为:[0, n]
- 那么,每次 check 函数后,若满足,则 right = mid,因为最佳答案一定在 [0, mid] 中,反之为 [mid + 1, right]
- 最终答案:left == right 返回二者其一都可
- 求最大满足值
若二分答案是求最大满足值,我们可以转变思维,变为求最小不满足值,最后的答案减一即可,但是这里需要判断是否存在大于目标的不满足值
- 答案的分布区间为:【…,满足,最大满足,最小不满足,不满足】,此时依然可以使用 lowerBound 求第一个最小不满足值,其前一位即为原本的答案。
- 原答案范围:[0, n]
- 转变后:[1, n + 1]
- 答案:(left or right) - 1
也可以直接求最大满足值,此时因为存在left=mid,因此需要让mid落在右侧,即令mid向上取整
