ArrayList<String>排序方法未返回预期结果,疑存在逻辑错误
问题分析与修复
原方法没实现排序的核心原因是逻辑完全错误:代码里只在两个字符串完全相等时才往新列表加元素,等于啥排序逻辑都没做,最后返回的新列表和原列表顺序一模一样。
错误代码问题拆解
看你的sortWords方法:
public ArrayList<String> sortWords(ArrayList<String> wordList) { ArrayList<String> newList = new ArrayList<String>(); for(int outter = 0; outter<wordList.size(); outter ++){ for(int inner = 0; inner<wordList.size(); inner ++){ if((wordList.get(outter)).compareTo(wordList.get(inner)) ==0 ){ newList.add(inner,wordList.get(outter)); } } } return newList; }
这里compareTo() == 0只有当内外层循环取到同一个元素时才成立,相当于把原列表的元素按原顺序又抄了一遍,完全没做排序。
修复方案
如果要手动用compareTo()实现字母序排序,给你两种可行方案:
方案1:手动写冒泡排序(符合手动比较的要求)
冒泡排序通过相邻元素比较交换,逐步把大的元素移到后面,用compareTo()判断字符串顺序:
public ArrayList<String> sortWords(ArrayList<String> wordList) { // 先复制原列表,避免修改传入的原数据 ArrayList<String> sortedList = new ArrayList<>(wordList); int listSize = sortedList.size(); // 外层循环控制排序轮数 for (int i = 0; i < listSize - 1; i++) { // 内层循环比较相邻元素,每轮把最大的元素移到末尾 for (int j = 0; j < listSize - i - 1; j++) { // compareTo返回正数,说明当前元素比后一个元素大,需要交换位置 if (sortedList.get(j).compareTo(sortedList.get(j + 1)) > 0) { String temp = sortedList.get(j); sortedList.set(j, sortedList.get(j + 1)); sortedList.set(j + 1, temp); } } } return sortedList; }
方案2:用Java内置工具类(简洁高效)
如果不需要手动实现排序逻辑,直接用Collections.sort()就行,底层也是基于compareTo()做自然排序:
import java.util.Collections; public ArrayList<String> sortWords(ArrayList<String> wordList) { ArrayList<String> sortedList = new ArrayList<>(wordList); Collections.sort(sortedList); return sortedList; }
测试结果
用你提供的测试文本:environment,city,character,road,salad,banner,bed,thank,attachment,medium,record,speech,pause,修复后的方法会返回正确排序结果:[attachment, banner, bed, character, city, environment, medium, pause, record, road, salad, speech, thank]
你的MyConsole代码没问题,调用sortWords()后直接打印就可以,要是想输出更清晰,可以换成System.out.println()或者遍历逐个打印元素。
内容的提问来源于stack exchange,提问作者N3wb1e
相关产品推荐
相关产品推荐

