使用合并排序对对象的Arraylist进行排序

时间:2017-01-11 04:35:02

标签: java algorithm sorting

我有一个由OrderNo和CustomerID组成的Item对象的ArrayList。我想根据OrderNo使用合并排序对列表进行排序,其对应的CustomerID保持不变。

我理解问题的合并排序部分,因为我已经在普通数组甚至是ArrayLists上完成了它。但是,当我必须将已排序的OrderNo与其对应的CustomerID匹配时,出现了这种情况下的问题。

public class Items {
    private int orderNo;
    private int customerID;

    public Items(int r, int c, String p) {
        this.orderNo = r;
        this.customerID = c;
    }
   //getters and setters
}

然后我创建一个Items列表,并为orderNo和customerID提供它们的值。

ArrayList<Items> i = new ArrayList<Items>();
i.add(new Items(orderNo, customerID);

我需要根据orderNo排序,但还要确保customerID与相应的orderNo匹配

这是合并排序实现:

 private static ArrayList mergeSort(ArrayList<Integer> left, ArrayList<Integer> right, ArrayList<Integer> whole) {
        int leftIndex = 0;
        int rightIndex = 0;
        int wholeIndex = 0;

        while (leftIndex < left.size() && rightIndex < right.size()) {
            if ( (left.get(leftIndex) < right.get(rightIndex))) {
                whole.set(wholeIndex, left.get(leftIndex));
                leftIndex++;
            } else {
                whole.set(wholeIndex, right.get(rightIndex));
                rightIndex++;
            }
            wholeIndex++;
        }

        ArrayList<Integer> rest;
        int restIndex;
        if (leftIndex >= left.size()) {
            // The left ArrayList has been use up...
            rest = right;
            restIndex = rightIndex;
        } else {
            // The right ArrayList has been used up...
            rest = left;
            restIndex = leftIndex;
        }

        for (int i=restIndex; i<rest.size(); i++) {
            whole.set(wholeIndex, rest.get(i));
            wholeIndex++;
        }

        return whole;
    }

public static ArrayList<Integer> merge(ArrayList<Integer> a)
    {
        int total = a.size();
        if(total < 2)
        {
            return a;
        }
        else
        {
            int mid = a.size() / 2;
            ArrayList<Integer> left = new ArrayList<>();
            ArrayList<Integer> right = new ArrayList<>();

            for(int i = 0; i < mid; i++)
            {
                left.add(a.get(i));
            }
            for(int i = mid; i < total; i ++)
            {
                right.add(a.get(i));
            }

            left = merge(left);
            right = merge(right);

            return mergeSort(left, right, a);
        }
    }

上述实现使用简单的值列表。我尝试将其更改为使用Items对象,方法是过滤掉Items中的orderNo并将其提供给方法......但是我确定这不是解决问题的方法,因为那样做弄乱了每个订单与每个相应customerId的关系。

1 个答案:

答案 0 :(得分:3)

  

我需要根据orderNo对它们进行排序,但也要确保customerID与相应的orderNo匹配。

如果你正确实现排序,它不会搞砸customerID和orderNo之间的关系。 (排序算法不应该调用Items对象上的setter方法。您应该移动数组/数组列表中的项目。)

所以这个问题实际上归结为实现合并排序。因为这(显然)是一项家庭作业,所以给你源代码会失败。建议你自己捏造并自己写下来。

但有一个提示:如果将ArrayList元素复制到Items[]数组,对数组进行排序,然后将其复制回来,则会更简单。像这样:

Items[] array = new Items[list.size()];
list.toArray(array);

// Sort the array here

list.clear();
list.addAll(Arrays.asList(array));

查看您的代码:

您的大错(IMO)是您正在尝试对ArrayList<Integer>个对象进行排序。你应该对ArrayList<Items>进行排序。 (我还没看过方法实现......)