所以我try 使用整型、双精度和字符值来练习实现插入排序算法,我能够对我的列表进行排序,但是我的原始列表显示了错误的结果.应该在我的代码中显示来自Test1、Test2、Test3的数据值.谁能告诉我,因为我已经被困了很长一段时间,我错过了什么?

import java.util.ArrayList;
public class InsertionSort<E extends Comparable<E>> {
  
    public void insertionSort(ArrayList<E> list) {
int n = list.size();
        for (int i = 1; i < n; i++) {
            E key = list.get(i);
            int j = i - 1;
            while (j >= 0 && list.get(j).compareTo(key) > 0) {
                list.set(j + 1, list.get(j));
                j--;
            }
            list.set(j + 1, key);
        }
    }

    public static void main(String[] args) {
        int[] test1 = {3, 5, 2, 4, 1, 8, 7, 6, 9};
        double[] test2 = {1.99, 2.05, 9.01, 6.49, 3.14, 5.55};
        char[] test3 =  "algorithm".toCharArray();
ArrayList<Integer> list1 = new ArrayList<>();
        for (int num : test1) {
            list1.add(num);
        }
        InsertionSort<Integer> integerSorter = new InsertionSort<>();
        integerSorter.insertionSort(list1);
        System.out.println("Test Example 1");
        System.out.println("Original List: " + list1);
        System.out.println("Sorted List: " + list1);
  
    ArrayList<Double> list2 = new ArrayList<>();
        for (double num : test2) {
            list2.add(num);
        }
        InsertionSort<Double> doubleSorter = new InsertionSort<>();
        doubleSorter.insertionSort(list2);
        System.out.println("\nTest Example 2");
        System.out.println("Original List: " + list2);
        System.out.println("Sorted List: " + list2);

        ArrayList<Character> list3 = new ArrayList<>();
        for (char ch : test3) {
            list3.add(ch);
        }
        InsertionSort<Character> charSorter = new InsertionSort<>();
        charSorter.insertionSort(list3);
        System.out.println("\nTest Example 3");
        System.out.println("Original List: " + list3);
        System.out.println("Sorted List: " + list3);
 
    }
}

推荐答案

问题是您打印的是originalsorted listssame列表对象.

因此,当您在排序过程中修改列表时,所做的修改会同时反映在原始和排序的列表输出中.

因此,您可以在对列表进行排序之前创建单独的列表副本,然后将副本打印为原始列表.

    import java.util.ArrayList;
import java.util.Arrays;

public class InsertionSort<E extends Comparable<E>> {

    public void insertionSort(ArrayList<E> list) {
        int n = list.size();
        for (int i = 1; i < n; i++) {
            E key = list.get(i);
            int j = i - 1;
            while (j >= 0 && list.get(j).compareTo(key) > 0) {
                list.set(j + 1, list.get(j));
                j--;
            }
            list.set(j + 1, key);
        }
    }

    public static void main(String[] args) {
        int[] test1 = {3, 5, 2, 4, 1, 8, 7, 6, 9};
        double[] test2 = {1.99, 2.05, 9.01, 6.49, 3.14, 5.55};
        char[] test3 = "algorithm".toCharArray();

        ArrayList<Integer> list1 = new ArrayList<>();
        for (int num : test1) {
            list1.add(num);
        }
        InsertionSort<Integer> integerSorter = new InsertionSort<>();
        ArrayList<Integer> list1Copy = new ArrayList<>(list1); // Create a copy of the original list
        integerSorter.insertionSort(list1);
        System.out.println("Test Example 1");
        System.out.println("Original List: " + list1Copy);
        System.out.println("Sorted List: " + list1);

        ArrayList<Double> list2 = new ArrayList<>();
        for (double num : test2) {
            list2.add(num);
        }
        InsertionSort<Double> doubleSorter = new InsertionSort<>();
        ArrayList<Double> list2Copy = new ArrayList<>(list2); // Create a copy of the original list
        doubleSorter.insertionSort(list2);
        System.out.println("\nTest Example 2");
        System.out.println("Original List: " + list2Copy);
        System.out.println("Sorted List: " + list2);

        ArrayList<Character> list3 = new ArrayList<>();
        for (char ch : test3) {
            list3.add(ch);
        }
        InsertionSort<Character> charSorter = new InsertionSort<>();
        ArrayList<Character> list3Copy = new ArrayList<>(list3); // Create a copy of the original list
        charSorter.insertionSort(list3);
        System.out.println("\nTest Example 3");
        System.out.println("Original List: " + list3Copy);
        System.out.println("Sorted List: " + list3);
    }
}

因此通过创建原始列表(list1Copylist2Copylist3Copy)的单独副本.

您可以在排序前将它们打印为原始列表,而原始列表(list1list2list3)在排序过程中会被修改.

Java相关问答推荐

如何使用CSS为选定但未聚焦的表格行设置背景 colored颜色 ?

为什么一个Test的instance?& gt;在构造函数中接受非空对象?

在运行MVN测试时,为什么构建失败,并显示了java.lang.ClassNotFoundException:java.net.http.HttpResponse?

将关键字与正文中的_Allowed匹配,但带有__Signing可选后缀

如何在Java中从XML中获取特定的 node ,然后将其删除?

Com.example.service.QuestionService中的构造函数的参数0需要找不到的类型为';com.example.Dao.QuestionDao;的Bean

无法在Java中处理PayPal支付响应

SpringBoot Kafka自动配置-适用于SASL_PLAYTEXT的SSLBundle 包,带SCRAM-SHA-512

使用PDFBox从PDF中删除图像

Spring安全令牌刷新和JWT签名与本地计算的签名不匹配

二进制数据的未知编码/序列化

垃圾回收器是否真的删除超出作用域的对象?

如何通过Java java.lang.Foreign API访问本机字节数组

协同 routine 似乎并不比JVM线程占用更少的资源

我该如何为我的类编写getter和setter方法?

具有多个分析模式的复杂分隔字符串的正则表达式

JOOQ:批处理CRUD操作使用动态表定义,如何?

ReturnedRect在升级后反转

如何在更改分辨率时将鼠标坐标计算为世界坐标

如何解释泛型类层次 struct 中子类的返回值类型和参数定义?