我有一个由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的关系。
答案 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>
进行排序。 (我还没看过方法实现......)