如何用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
相关产品推荐
相关产品推荐

