提问人:Vikki 提问时间:11/17/2023 更新时间:11/18/2023 访问量:53
如何制作按第二个字符排序的字符串数组列表
How to make an arraylist of string sorted by the second character
问:
我想对要按第二个字符排序的 String 的 arrayList 进行排序,并使用可比较的接口和 CompareTo 方法。
public class Main implements Comparable<String>{
public static void main(String[] args){
ArrayList<String> arr = new ArrayList<>();
arr.add("abc");
arr.add("cde");
arr.add("ace");
arr.add("crf");
arr.add("pgq");
arr.add("zav");
Collections.sort(arr);
}
@Override
public int compareTo(String temp){
what should I write here;
}
}
我期待的结果如下:
ZAV、ABC、ACE、CDE、PQQ、CRF;
答:
0赞
Chaosfire
11/17/2023
#1
此接口对实现它的每个类的对象施加总排序。这种排序称为类的自然排序,类的 compareTo 方法称为其自然比较方法。
从:Comparator
比较函数,它对某些对象集合施加总排序。可以将比较器传递给排序方法(例如 Collections.sort 或 Arrays.sort),以允许精确控制排序顺序。比较器还可用于控制某些数据结构(如排序集或排序映射)的顺序,或为没有自然排序的对象集合提供排序。
它不能用 完成,因为实现了它,这意味着它的自然顺序已经定义,你不能改变它。这就是为什么你需要定义自定义比较策略,这就是发挥作用的地方(这就是它的设计目的)。Comparable
String
Comparator
public class Main {
public static void main(String[] args) {
ArrayList<String> arr = new ArrayList<>();
arr.add("abc");
arr.add("cde");
arr.add("ace");
arr.add("crf");
arr.add("pgq");
arr.add("zav");
Collections.sort(arr, Comparator.comparingInt(s -> s.charAt(1)));
System.out.println(arr);
//prints [zav, abc, ace, cde, pgq, crf]
}
}
请记住,这没有考虑到字符串少于 2 个字符的可能性(如果约束允许此类输入,则需要在实现中处理它)。
评论
0赞
Vikki
11/18/2023
我使用比较器获得了实现,但您能否详细说明为什么无法使用比较器完成它。
1赞
Chaosfire
11/18/2023
@Vikki检查更新的答案,我认为它回答了为什么的问题。
0赞
Reilas
11/18/2023
#2
"...我想对要按第二个字符排序的 String 的 arrayList 进行排序,并使用可比较的接口和 CompareTo 方法。..."
您无需实现 Comparable。
下面是一个示例。
arr.sort((a, b) -> Character.compare(a.charAt(1), b.charAt(1)));
或者,更简洁地说,使用 Comparator#comparingInt 方法。
arr.sort(Comparator.comparingInt(x -> x.charAt(1)));
输出
[zav, abc, ace, cde, pgq, crf]
评论
Main
String