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。
问题
我有一个非常基本的字符串列表数组,它是从一个 .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。