如何制作按第二个字符排序的字符串数组列表

How to make an arraylist of string sorted by the second character

提问人:Vikki 提问时间:11/17/2023 更新时间:11/18/2023 访问量:53

问:

我想对要按第二个字符排序的 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;

Java 可比

评论

3赞 Rifat Rubayatul Islam 11/17/2023
你想和 ?MainString
0赞 VGR 11/17/2023
使用其他 Collections.sort 方法。您必须提供自己的 Comparator 实现,用于比较每个 String 的第二个字符。

答:

0赞 Chaosfire 11/17/2023 #1

你需要一个比较器,而不是可比。从:Comparable

此接口对实现它的每个类的对象施加总排序。这种排序称为类的自然排序,类的 compareTo 方法称为其自然比较方法。

从:Comparator

比较函数,它对某些对象集合施加总排序。可以将比较器传递给排序方法(例如 Collections.sort 或 Arrays.sort),以允许精确控制排序顺序。比较器还可用于控制某些数据结构(如排序集或排序映射)的顺序,或为没有自然排序的对象集合提供排序。

它不能用 完成,因为实现了它,这意味着它的自然顺序已经定义,你不能改变它。这就是为什么你需要定义自定义比较策略,这就是发挥作用的地方(这就是它的设计目的)。ComparableStringComparator

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]