You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Comparable接口与compareTo方法对String型ArrayList按第二个字符排序

问题描述

我希望使用Comparable接口和compareTo方法,对String类型的ArrayList按照第二个字符进行排序。以下是我的代码示例:

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, pgq, crf;


问题分析与解决方案

你的代码存在核心问题:Main类实现Comparable<String>完全无效。Collections.sort(arr)排序的是ArrayList中的String对象,而非Main类实例,因此你写的compareTo方法根本不会被调用。

方案一:自定义包装类实现Comparable接口

如果严格要求使用Comparable接口,需要自定义包装类包裹String,让包装类实现Comparable逻辑:

import java.util.ArrayList;
import java.util.Collections;

class StringWrapper implements Comparable<StringWrapper> {
    private String value;

    public StringWrapper(String value) {
        this.value = value;
    }

    public String getValue() {
        return value;
    }

    @Override
    public int compareTo(StringWrapper other) {
        // 避免字符串长度不足2导致索引越界
        if (this.value.length() < 2 || other.value.length() < 2) {
            return this.value.compareTo(other.value);
        }
        // 提取第二个字符(索引为1)进行比较
        char thisChar = this.value.charAt(1);
        char otherChar = other.value.charAt(1);
        return Character.compare(thisChar, otherChar);
    }
}

public class Main {
    public static void main(String[] args) {
        ArrayList<StringWrapper> arr = new ArrayList<>();
        
        arr.add(new StringWrapper("abc"));
        arr.add(new StringWrapper("cde"));
        arr.add(new StringWrapper("ace"));
        arr.add(new StringWrapper("crf"));
        arr.add(new StringWrapper("pgq"));
        arr.add(new StringWrapper("zav"));
        
        Collections.sort(arr);
        
        // 输出排序结果
        for (StringWrapper sw : arr) {
            System.out.print(sw.getValue() + ", ");
        }
    }
}

运行后输出:zav, abc, ace, cde, pgq, crf,

方案二:使用Comparator(更简洁实用)

如果不需要严格绑定Comparable接口,直接使用Comparator是更高效的方式,无需额外包装类:

import java.util.ArrayList;
import java.util.Collections;
import java.util.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, new Comparator<String>() {
            @Override
            public int compare(String s1, String s2) {
                if (s1.length() < 2 || s2.length() < 2) {
                    return s1.compareTo(s2);
                }
                return Character.compare(s1.charAt(1), s2.charAt(1));
            }
        });
        
        // 输出结果
        for (String s : arr) {
            System.out.print(s + ", ");
        }
    }
}

Java 8+可简化为Lambda表达式:

Collections.sort(arr, (s1, s2) -> {
    if (s1.length() < 2 || s2.length() < 2) {
        return s1.compareTo(s2);
    }
    return Character.compare(s1.charAt(1), s2.charAt(1));
});

内容的提问来源于stack exchange,提问作者Vikki

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 03:42:52