JAVA - ArrayList<String> 中的插入排序方法部分有效,但无法正确排序整个列表

JAVA - Insertion Sort Method from ArrayList<String> partially works but doesn't sort the whole list correctly

问题

我有一个非常基本的字符串列表数组,它是从一个 .txt 文件中扫描出来的,我将其传递给 insertionSort 方法以对其进行排序按字母顺序,但它似乎只对最后一个进行排序数组列表末尾的 2 或 3 对名称。我觉得可能是我在 insertionSort 方法中的 while 循环导致使用 compareTo() 方法交换存储在数组中的字符串的索引。

控制台输出

[James, Michael, Adam, Brenda, Margaret, Luke, Chantel, Enzo, Daniel, Lisa] <- original .txt list
[James, Michael, Adam, Brenda, Luke, Margaret, Chantel, Daniel, Enzo, Lisa] <- output

我只需要帮助来理解一项作业,以及为什么我的实现对于我的数据结构和算法无法正常工作 class。感谢任何帮助,谢谢!!

    import java.util.Scanner;
    import java.util.ArrayList;
    import java.io.*;
    import java.util.*;

    public class Insert {
    
    public static void insertionSort(List<String> list) {
        for (int j = 1; j < list.size(); j++) {
            String current = list.get(j);
            int i = j-1;
            while ((i > -1) && ((list.get(i).compareTo(current)) == 1)) {
                list.set(i+1, list.get(i));
                i--;
            }
            list.set(i+1, current);
        }
        System.out.print(list);
    }

    
    public static void main(String[] args) throws FileNotFoundException{
        
        List<String> data = new ArrayList<>();
        
        File inputFile = new File("customer.txt");
        Scanner in = new Scanner(inputFile);
        
        while (in.hasNextLine())
        {
            data.add(in.nextLine());
        }
        System.out.println(data);
        
        Insert test = new Insert();
        test.insertionSort(data);
    }
}

您的基本问题是 String.compareTo() 不一定 return -1 或 1 表示更大或更小的字符串,但它可以是 < 0 或 > 0 的任何值。

因此您需要将条件更改为:list.get(i).compareTo(current) > 0.

String.compareTo(String) 上的 JavaDoc 指出:

  • 如果两个字符串在索引 k 处有不同的字符,那么 this.charAt(k)-anotherString.charAt(k) 是 returned
  • 如果一个字符串是另一个字符串的前缀(例如“abc”是“abcde”的前缀),则 this.length()-anotherString.length() 是 returned。

如您所见,这些计算不一定会产生 -1、0 或 1。

Comparable.compareTo(...) 上的 JavaDoc 是这样描述的:

Returns a negative integer, zero, or a positive integer as this object is less than, equal to, or greater than the specified object.

它没有提到 return 值必须是 -1、0 和 1。