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 自增列三种方式
KingbaseES中3种自增长类型sequence,serial,identity的区别: 对象 显示插入 显示插入后更新最大值 清空表后是否重置 是否跟事务一起回滚 多对象共享 支持重置 出现错误 ...
- DataTable转Json格式
public static string DataTable2Json(DataTable dt) { StringBuilder jsonBuilder = new StringBuilder(); ...
- G&GH02 储存库创建/同步
注意事项与声明 平台: Windows 10 作者: JamesNULLiu 邮箱: jamesnulliu@outlook.com 博客: https://www.cnblogs.com/james ...
- Spring 后置处理器【1】
Spring 后置处理器[1] 简单介绍 一句话:bean 在初始化前或初始化后的瞬间,我自己添加一些业务逻辑 bean 后置处理器类的内容 简单代码 package com.hspedu.sprin ...
- Kubernetes DevOps: Jenkins
提到基于 Kubernete 的CI/CD,可以使用的工具有很多,比如 Jenkins.Gitlab CI 以及新兴的 drone 之类的,我们这里会使用大家最为熟悉的 Jenkins 来做 CI/C ...
- kubeadm init 命令执行流程
- 关于使用kuboard安装其自带的监控应用的注意事项
在安装过程中若想监控kube-controller-manager和kube-scheduler,需要按步骤中的如下说明操作 在这里,所有master节点的这俩文件都需要修改,不用apply,等一分钟 ...
- 在图片不被裁剪时opencv绕图片中任意点旋转任意角度
opencv绕图片中任意角度旋转任意角度 最近在做项目需要把把图片绕图片中任意点旋转任意角度,考虑到自己旋转需要编写插值算法,所以想到了用opencv,但是网上都是围绕图片中点旋转任意角度的,都是 ...
- PTA 乙级解题笔记 1001 害死人不偿命的(3n+1)猜想
卡拉兹(Callatz)猜想: 对任何一个正整数 n,如果它是偶数,那么把它砍掉一半:如果它是奇数,那么把 (3n+1) 砍掉一半.这样一直反复砍下去,最后一定在某一步得到 n=1.卡拉兹在 1950 ...
- MES与工业互联网的关联边界在哪里?
MES和工业互联网本不存在关联边界,如果有,那也只是MES包括在工业互联网中,是工业互联网的一部分.二者本来就是处于两个不同维度提出来的概念.MES是从信息系统维度提出来的,上承ERP.下接PCS的制 ...