Java:ArrayList 对象的归并排序

标签 java sorting

我在将原始列表复制到帮助程序列表时得到 IndexOutOfBoundException。仅当原始列表具有偶数个对象时才会发生。想不通。这是代码:

public static void mergeSort(List<Person> list) {
        List<Person> helper = new ArrayList<Person>();
        mergeSort(list, helper, 0, list.size());
    }

    private static void mergeSort(List<Person> list, List<Person> helper, int low, int high) {
        if(low < high) {
            int middle = (low+high)/2;
            mergeSort(list, helper, low, middle); //sort left half
            mergeSort(list, helper, middle+1, high); //sort right half
            merge(list, helper, low, middle, high); // merge
        }
    }

    private static void merge(List<Person> list, List<Person> helper, int low, int middle, int high) {
        //This loop throws Exception
        for(int i=low; i< high + 1; i++) {
            helper.add(i, list.get(i));
        }

        int helperLeft = low;
        int helperRight = middle + 1;
        int current = low;

        /**
         * Iterate through helper array, copying back smaller element in the original list 
         */
        while(helperLeft < middle && helperRight < high) {
            if(helper.get(helperLeft).isLessThan( helper.get(helperRight))) {
                list.set(current, helper.get(helperLeft));
                helperLeft++;
            } else {
                list.set(current, helper.get(helperRight));
                helperRight++;
            }
            current++;
        }

        //Copy remaining elements
        int remaining = middle - helperLeft;
        for(int j=0; j <= remaining; j++) {
            list.set(current+j, helper.get(helperLeft+j));
        }

    }

测试数据

List<Person> list = new ArrayList<Person>();
        list.add(new Person("1L", "10", "1", "1960"));
        list.add(new Person("1L", "4", "5", "1978"));
        list.add(new Person("1L", "9", "17", "1986"));
        list.add(new Person("1L", "2", "15", "1971"));
        list.add(new Person("1L", "7", "1", "1971"));
        list.add(new Person("1L", "7", "1", "1972"));

Person.java

public class Person implements Comparable<Person>{

    private String personId;
    private String month;
    private String day;
    private String year;
    private Date personDay;
    static SimpleDateFormat formatter = new SimpleDateFormat("MM/dd/yyyy");

    public Person(String id, String month, String day, String year) {
        this.personId = id;
        this.month = month;
        this.day = day;
        this.year = year;
    }

    @Override
    public int compareTo(Person person) {
        return this.getPersonDay().compareTo(person.getPersonDay());
    }

    public boolean isLessThan(Person person) {
        boolean isLess = false;
         if(this.getPersonDay().compareTo(person.getPersonDay()) < 0) {
             isLess = true;
         }
         return isLess;
    }
}

最佳答案

我看到一个问题,事实上在对 mergeSort 的初始调用中你传递了 list.size()作为high .

你的 merge方法迭代 i来自 lowhigh , 包括 high ( for(int i=low; i< high + 1; i++) ),意思是 i越界,因为list.size()出界了。

最初的调用应该是:

mergeSort(list, helper, 0, list.size() - 1);

关于Java:ArrayList 对象的归并排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28855350/

相关文章:

java - 如何使用 Velocity 脚本的 SortTool 对字符串列表进行排序?

java - Guava 缓存 : how to set expiration on 'CacheLoader.load()' instead of during CacheBuilder. newBuilder()?

java - Spring 3 + Tomcat 6 : Form validation exception - java. lang.NoSuchMethodError : javax. el.ExpressionFactory.newInstance()Ljavax/el/ExpressionFactory;

java - 干净地关闭 JGit

java - 在企业网络中解锁防火墙以访问 Google 文本转语音 API 需要什么 URL?

swift - Dart 中的列表排序与 Swift 中的排序列表不同

c++ - 在 VS14 中排序不能正常工作,而在 VS10 中可以吗?

java - 执行网络命令android

r - 使用 dplyr 按最后一列对数据框进行排序

javascript - 使用 AJAX/Javascript/jQuery 构建和重新排序多维数组