Java 使用合并排序对对象的Arraylist排序

Java 使用合并排序对对象的Arraylist排序,java,algorithm,sorting,Java,Algorithm,Sorting,我有一个由OrderNo和CustomerID组成的Item对象的ArrayList。我想根据OrderNo使用合并排序对列表进行排序,并且相应的CustomerID保持不变 我理解问题的合并排序部分,就像我在普通数组甚至数组列表上所做的那样。但是,当我必须将排序后的OrderNo与其对应的CustomerID进行匹配时,这个场景中的问题就出现了 public class Items { private int orderNo; private int customerID;

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

我理解问题的合并排序部分,就像我在普通数组甚至数组列表上所做的那样。但是,当我必须将排序后的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
}
ArrayList<Items> i = new ArrayList<Items>();
i.add(new Items(orderNo, customerID);
然后我创建一个项目数组列表,并为它们提供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
}
ArrayList<Items> i = new ArrayList<Items>();
i.add(new Items(orderNo, customerID);
ArrayList i=new ArrayList();
i、 添加(新项目(订单号、客户ID);
我需要根据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);
        }
    }
私有静态ArrayList合并排序(ArrayList左、ArrayList右、ArrayList全){
int leftIndex=0;
int rightIndex=0;
int-wholeIndex=0;
而(leftIndex=left.size()){
//左数组列表已用完。。。
休息=右;
restIndex=rightIndex;
}否则{
//正确的ArrayList已用完。。。
休息=左;
restIndex=leftIndex;
}
for(int i=restIndex;i
我需要根据orderNo对它们进行排序,但还要确保customerID与它们相应的orderNo匹配

如果正确实现排序,则不会打乱customerID和orderNo之间的关系。(排序算法不应调用
对象上的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
对象进行排序。您应该对
ArrayList
进行排序(我还没有查看方法实现…)

您的问题含糊不清。请展示一些代码来演示您的问题。为什么不实现comparable的compareTo方法,并使用Java提供的collections.sort方法?@AvinashAnand使用
collections.sort()
将无法通过
OrderNo
@ZeroDarkThirty在
ArrayList
上完成编写合并排序的任务,这会好一点,但我仍然不理解这个问题。为什么您认为对
项进行排序会导致它们的数据不匹配?好的,那么问题是您的方法希望与一起工作e> ArrayList
。您需要将其更改为
ArrayList
,并将比较应用于从该列表检索到的对象。例如,
if((left.get(leftIndex.getOrderNo()
。我在原始帖子中添加了合并排序实现,以提供更好的上下文。我知道它应该是ArraList。这不是主要问题。该方法的一些内部逻辑需要更改。呃,不。如果对
ArrayList进行排序,则不会出现订单号和项目ID分离的问题。t解决那个问题的正确方法是一开始就不要有它!