int[]不支持自定义排序,Integer[]才支持

原因是Comparator只支持泛型元素,而int不是一个对象。
因此int数组没办法倒序排序,当然可以先正序排序,再反转数组。

Arrays和Collections

  • Arrays.sort()可以指定from和end,但是Collections.sort()不行

image.png
image.png

  • Collections.swap(),但是没有Arrays.swap()

循环体中可改变循环限制条件

测试实例

  1. System.out.println("----while循环测试----");
  2. int i = 0;
  3. int limit = 4;
  4. System.out.println("初始状态:" + "i=" + i + " limit=" + limit);
  5. while (i < limit) {
  6. i += 4;
  7. limit += 2;
  8. System.out.println("i=" + i + " limit=" + limit);
  9. }
  10. System.out.println("while循环结束\n");
  11. System.out.println("----for循环测试----");
  12. i = 0;
  13. limit = 4;
  14. System.out.println("初始状态:" + "i=" + i + " limit=" + limit);
  15. for (; i < limit; i += 4) {
  16. limit += 2;
  17. System.out.println("i=" + i + " limit=" + limit);
  18. }
  19. System.out.println("for循环结束");

输出结果

  1. ----while循环测试----
  2. 初始状态:i=0 limit=4
  3. i=4 limit=6
  4. i=8 limit=8
  5. while循环结束
  6. ----for循环测试----
  7. 初始状态:i=0 limit=4
  8. i=0 limit=6
  9. i=4 limit=8
  10. for循环结束

stream与sum

集合框架转为stream后并没有sum()方法
而数组转为stream后才有sum()方法

关于str.split(String regex)

  • 在str中出现的regex,无论连续出现几次,都不会在结果中出现

    1. String[] strs = ":::::".split(":");
    2. System.out.println(strs.length); // out: 0
    3. System.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]

  1. <a name="ab1b9"></a>
  2. ####
  3. <a name="zevTY"></a>
  4. #### 排序规则
  5. ```java
  6. (o1, o2) -> o1 - o2 // 从小到大排序 & 小根堆
  7. (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向上取整