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 ...
随机推荐
- volatile 函数影响子查询提升
我们知道 volatile 函数会影响SQL的执行性能,比如:volatile 类型函数无法建函数索引.volatile 函数针对每条记录都要执行一次.本篇的例子主要讲述 volatile 类型的函数 ...
- LIKE与等式查询比较
我们知道 char 是定长类型的数据,如果数据长度小于定义的长度,会在字符串尾部加上空格.而对于空格的处理,对于等式匹配,或length等,会忽略空格.而对于like 或模式匹配,空格不能忽略. 一. ...
- 分布式链路追踪体验-skywalking入门使用
背景 旁友,你的线上服务是不是偶尔来个超时,或者突然抖动一下,造成用户一堆反馈投诉.然后你费了九牛二虎之力,查了一圈圈代码和日志才总算定位到问题原因了.或者公司内部有链路追踪系统,虽然可以很轻松地通过 ...
- HashMap不安全后果及ConcurrentHashMap线程安全原理
Java集合HashMap不安全后果及ConcurrentHashMap 原理 目录 HashMap JDK7 HashMap链表循环造成死循环 HashMap数据丢失 JDK7 Concurrent ...
- RedHat Linux升级内核
操作系统:Red Hat 6.4 内核文件:linux-3.10.1.tar.gz https://www.cnblogs.com/cherish-sweet/p/newyum.html uname ...
- Java SE 3、封装
封装 封装的好处 隐藏实现细节 可以对数据进行验证,保证安全合理 实现步骤 将属性进行私有化private 提供一个公共的(public)set方法,用于对属性判断并赋值 public void se ...
- Elasticsearch: Cerebro 用户界面介绍
- 第四章:Django表单 - 2:Django表单API详解
声明:以下的Form.表单等术语都指的的广义的Django表单. Form要么是绑定了数据的,要么是未绑定数据的. 如果是绑定的,那么它能够验证数据,并渲染表单及其数据,然后生成HTML表单.如果未绑 ...
- 第四章:Django表单 - 1:使用表单
假设你想从表单接收用户名数据,一般情况下,你需要在HTML中手动编写一个如下的表单元素: <form action="/your-name/" method="po ...
- 如何在Elasticsearch中使用pipeline API来对事件进行处理
一个processor就像是Logstash里的一个filter pipeline是一组processor