JAVA中有很多方便的内置函数和方法,其方法可以自定义和改写。
今天对Sort方法做一下小结:
-
对数组进行排序
1.1 默认排序(升序)
int[] temp = {3, 6, 9, 3, 2, 1, 8, 7}; Arrays.sort(temp); System.out.println(Arrays.toString(temp)); //输出:[1, 2, 3, 3, 6, 7, 8, 9]
1.2 自定义排序(降序)(1D)
注意‼️: 这里不能定义int[], 而要定义Integer[], 以object形式操作才行/** 1.重写Comparator函数**/ Integer[] temp = {3, 6, 9, 3, 2, 1, 8, 7}; Arrays.sort(temp, new Comparator<Integer>() { public int compare(Integer a, Integer b) { return b - a; } }); System.out.println(Arrays.toString(temp)); //输出:[9, 8, 7, 6, 3, 3, 2, 1] /**2. Lambda函数表达式**/ Integer[] temp = {3, 6, 9, 3, 2, 1, 8, 7}; Arrays.sort(temp, (a, b) -> b - a); System.out.println(Arrays.toString(temp)); //输出:[9, 8, 7, 6, 3, 3, 2, 1]
1.3自定义排序(升序)(2D)
//按[0]维升序排,如果[0]相等,则按[1]维升序排 int[][] array = {{5, 7}, {5, 2}, {2, 5}, {5, 8}, {7, 1}, {4, 3}, {2, 3}}}; Arrays.sort(array, new Comparator<int[]>() { @Override public int compare(int[] o1, int[] o2) { return o1[0] == o2[0] ? o1[1] - o2[1] : o1[0] - o2[0]; } }); //输出: [2, 3] [2, 5] [4, 3] [5, 2] [5, 7] [5, 8] [7, 1]
-
对集合进行排序
2.1 默认排序(升序)
/** 注意事项 **/ //如果使用Arrays.asList()进行初始化,则当想把初始化的list加入List<List<Integer>> res //需要res.add((List<Integer>)list); 用(List<Integer>)进行强转, 否则会报错. List<Integer> list = Arrays.asList(3, 6, 9, 3, 2, 1, 8, 7); Collections.sort(list); System.out.println(list); //输出:[1, 2, 3, 3, 6, 7, 8, 9]
2.2 自定义排序(降序)
/** 1.重写Comparator函数**/ List<Integer> list = Arrays.asList(3, 6, 9, 3, 2, 1, 8, 7); Collections.sort(list, new Comparator<Integer>() { public int compare(Integer a, Integer b) { return b - a; } }); System.out.println(list); //输出:[9, 8, 7, 6, 3, 3, 2, 1] /**2. Lambda函数表达式**/ //形式1: List<Integer> list = Arrays.asList(3, 6, 9, 3, 2, 1, 8, 7); Collections.sort(list, (a, b) -> b - a); System.out.println(list); //输出:[9, 8, 7, 6, 3, 3, 2, 1] //形式2: List<Integer> list = Arrays.asList(3, 6, 9, 3, 2, 1, 8, 7); Collections.sort(list, (a, b) -> { return b - a; }); System.out.println(list); //输出:[9, 8, 7, 6, 3, 3, 2, 1]
-
堆排序
//默认最小堆 Queue<Integer> minPq = new PriorityQueue<>(); //自定义最大堆 Queue<Integer> maxPq = new PriorityQueue<>(new Comparator<Integer>() { @Override public int compare(Integer o1, Integer o2) { return o2 - o1; } }); //稍复杂排序 //题目来源: https://algo.monster/problems/top_k_frequently_mentioned_keywords /**HashMap<字符, 出现的频数>, 按频数降序排列,若频数相同则字符按字典序排列**/ HashMap<String, Integer> map = new HashMap<>(); Queue<Map.Entry<String, Integer>> maxPq = new PriorityQueue<>(new Comparator<Map.Entry<String, Integer>>() { @Override public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) { return o2.getValue().equals(o1.getValue()) ? o1.getKey().compareTo(o2.getKey()) : o2.getValue() - o1.getValue(); } }); //附加: //遍历HashMap中的Entry for (Map.Entry<String, Integer> en : map.entrySet()) { if (en.getValue() != 0) { maxPq.offer(en); } }
如若有遗漏请评论留言:) 有时间会补充