Java:自定义排序与sort()函数
自定义排序与Arrays.sort()
本篇题目来源:2022/11/13 Leetcode每日一题:https://leetcode.cn/problems/custom-sort-string
给定两个字符串 order 和 s 。order 的所有单词都是 唯一 的,并且以前按照一些自定义的顺序排序。
对 s 的字符进行置换,使其与排序的 order 相匹配。更具体地说,如果在 order 中的字符 x 出现字符 y 之前,那么在排列后的字符串中, x 也应该出现在 y 之前。
返回 满足这个性质的 s 的任意排列 。
示例1:
输入: order = "cba", s = "abcd"
输出: "cbad"
解释:
“a”、“b”、“c”是按顺序出现的,所以“a”、“b”、“c”的顺序应该是“c”、“b”、“a”。
因为“d”不是按顺序出现的,所以它可以在返回的字符串中的任何位置。“dcba”、“cdba”、“cbda”也是有效的输出。
示例2:
输入: order = "cbafg", s = "abcd"
输出: "cbad"
这是一道字符串自定义排序题,即按照一个约定的顺序,给字符串进行排序。
对于数组,Java提供了一个排序方法:Arrays.sort()。该函数有多个重载,对基本类型和引用类型均有排序。不过对于基本类型来说,只可按照默认顺序进行排序,无法自定义Comparator(原因:基本类型不能作为泛型);而对于引用类型,则可以自定义Comparator以实现自定义排序的效果。
- 基本类型也可以通过对应的包装类以实现自定义排序的功能
解题
1.对于这道题来说,首先需要将给定的顺序:order数组转为一个可比较顺序的int[]:
//表顺序的数组,这样,调用orders[c] = i即可表示:c排在order中的第i位
int[] orders = new int[26];
for(int i = 0; i < order.length(); ++i) {
orders[order.charAt(i) - 'a'] = i;
}
2.有了顺序后,就可以使用Arrays.sort()进行自定义排序:
//使用char的包装类Character以支持自定义排序
Character[] ans = new Character[s.length()];
for(int i = 0; i < s.length(); ++i) {
ans[i] = s.charAt(i);
}
//使用lambda表达式来简化Comparator的内容
Arrays.sort(ans, (c1, c2) -> orders[c1 - 'a'] - orders[c2 - 'a']);
扩展
实际上,Java不仅对数组类型提供了Arrays.sort()方法,对List类型同样提供了sort()方法,并且功能基本一致
同样,也可以对List的内容进行自定义排序,比如,有一个People实体类,结构如下:
public class People {
private String name;
private int age;
public People(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "People{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
现在,想根据People实体类中的age参数对People List进行排序,就可以通过List中的sort()方法来写自定义的Comparator:
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
public class PeopleSortDemo {
public static void main(String[] args) {
People p1 = new People("Bob", 25);
People p2 = new People("Lily", 30);
People p3 = new People("Li Ming", 18);
List<People> peopleList = new ArrayList<>();
peopleList.add(p1);
peopleList.add(p2);
peopleList.add(p3);
peopleList.sort((pa, pb) -> pa.getAge() - pb.getAge());
System.out.println(peopleList);
}
}
结果如下:
Java:自定义排序与sort()函数的更多相关文章
- python 中的sort 和java中的Collections.sort()函数的使用
x=[1,2,3] x.sort()对的,x这个都变了 y=x.sort()错误 y=sorted(x)对的,x拍好序的一个副本 python中用匿名函数和自定义函数排序:(很奇怪的是比较函数返回的是 ...
- LeetCode1029 两地调度(贪心+java自定义排序回顾)
题目: 公司计划面试 2N 人.第 i 人飞往 A 市的费用为 costs[i][0],飞往 B 市的费用为 costs[i][1]. 返回将每个人都飞到某座城市的最低费用,要求每个城市都有 N 人抵 ...
- Java自定义排序:继承Comparable接口,重写compareTo方法(排序规则)
代码: 1 import java.util.*; 2 3 /** 4 * 学习自定义排序:继承Comparable接口,重写compareTo方法(排序规则). 5 * TreeMap容器的Key是 ...
- 1016. Phone Bills (25) -vector排序(sort函数)
题目如下: A long-distance telephone company charges its customers by the following rules: Making a long- ...
- linux内核中的排序接口--sort函数
linux内核中的sort函数,其实跟我们所说的qsort函数很像,我们来看看qsort: qsort 的函数原型是 void qsort(void*base,size_t num,size_t wi ...
- java List 排序 Collections.sort() 对 List 排序
class User { String name; String age; public User(String name,String age){ this.name=name; this.a ...
- java List 排序 Collections.sort()
用Collections.sort方法对list排序有两种方法 第一种是list中的对象实现Comparable接口,如下: /** * 根据order对User排序 */ public class ...
- STL中vector的赋值,遍历,查找,删除,自定义排序——sort,push_back,find,erase
今天学习网络编程,那个程序中利用了STL中的sort,push_back,erase,自己没有接触过,今天学习一下,写了一个简单的学习程序.编译环境是VC6.0 这个程序使用了vect ...
- 使用sort函数进行排序
介绍 C++的一个重要组成部分STL(Standard Template Library),即标准模板库,是一些高级数据结构和算法的集合:高级数据结构(容器)主要包括list.set.vector.m ...
- 排序 sort函数
sort函数见下表: 函数名 功能描述 sort 对给定区间所有元素进行排序 stable_sort 对给定区间所有元素进行稳定排序 partial_sort 对给定区间所有元素部分排序 partia ...
随机推荐
- KingbaseES R3 受限dba影响集群切换
一.受限dba功能说明(参考自官方文档) 受限DBA 受限DBA可以对当前DBA的权限进行一定限制.当功能开启后DBA将不能更改以下对象: Table Database Function(by n ...
- Lua CallbackHell优化
概述 在异步操作中,常常要使用回调.但是,回调的嵌套常常会导致逻辑混乱,一步错步步错,难以维护.在Lua中,可以使用协程进行优化. 问题分析 模拟一个回合制游戏攻击过程 local function ...
- 算法:KMP, str1字符串是否包含str2字符串
[普通解法]从左到右遍历str1的每一个字符,然后看如果 以当前字符作为第一个字符出发 是否匹配 str2字符串. [KMP算法] 1)生成一个nextArr数组,长度与str2字符串长度一样.i 的 ...
- Spring入门(二):SpringBoot之基础Web开发
接上回 现在,我们已经能自行完成SpringBoot的初级项目搭建了,接下来看如何实现一些Web开发中的基础功能. 先看项目完整的目录结构: 1. 返回Json数据 创建model文件夹,并新建Per ...
- 添加 K8S CPU limit 会降低服务性能
文章转载自:https://mp.weixin.qq.com/s/cR6MpQu-n1cwMbXmVaXqzQ
- Alertmanager 概念与配置深入介绍
文章转载自:https://www.cnblogs.com/gered/p/13496950.html 警报一直是整个监控系统中的重要组成部分,Prometheus监控系统中,采集与警报是分离的. 报 ...
- 2. Fluentd事件的生命周期
事件(Event)是Fluentd内部处理流程使用的数据结构,日志记录一旦进入Fluentd便被封装成一个event.Event由三部分组成:tag.time.record. tag: 标识事件的来源 ...
- 「Tubian」Tubian0.41!支持Windows QQ微信!
Tubian 0.42已发布:https://www.cnblogs.com/tubentubentu/p/16745926.html Sourceforge.net下载:https://source ...
- Do not use “@ts-ignore” because it alters compilation errors的解决办法
在@ts-ignore上面添加一行代码: // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore
- HDU1423 Greatest Common Increasing Subsequence (DP优化)
LIS和LCS的结合. 容易写出方程,复杂度是nm2,但我们可以去掉一层没有必要的枚举,用一个变量val记录前一阶段的最优解,这样优化成nm. 1<=k<j,j增加1,k的上界也增加1,就 ...