为什么我的排序方法无法对某些字符进行排序?
Why does my sort method fail to sort some charachter?
所以,这是我的代码:
public ArrayList<Actor> SortArray(ArrayList<Actor> actorsArrayList){
if (actorsArrayList.size()==2){
if (actorsArrayList.get(0).getName().compareTo(actorsArrayList.get(1).getName())>0){
Actor tmpActor = actorsArrayList.get(0);
actorsArrayList.set(0, actorsArrayList.get(1));
actorsArrayList.set(1, tmpActor);
}
}if (actorsArrayList.size()>2){
ArrayList<Actor> part1 = new ArrayList<Actor> (actorsArrayList.subList(0, actorsArrayList.size()/2));
ArrayList<Actor> part2 = new ArrayList<Actor> (actorsArrayList.subList(actorsArrayList.size()/2, actorsArrayList.size()));
SortArray(part1);
SortArray(part2);
actorsArrayList = MergeArrays(part1,part2);
}
return actorsArrayList;
}
public ArrayList<Actor> MergeArrays(ArrayList<Actor> part1, ArrayList<Actor> part2){
ArrayList<Actor> mergedArray = new ArrayList<Actor>();
int i = 0;
int j = 0;
while (i<part1.size() && j<part2.size()){
if (part1.get(i).getName().compareTo(part2.get(j).getName())<0){
mergedArray.add(part1.get(i));
i=i+1;
}else if (part1.get(i).getName().compareTo(part2.get(j).getName())>0){
mergedArray.add(part2.get(j));
j=j+1;
}
}
while (i<part1.size()){
mergedArray.add(part1.get(i));
i=i+1;
}
while (j<part2.size()){
mergedArray.add(part2.get(j));
j=j+1;
}
return mergedArray;
}
此代码旨在与巨大的 ActorsArrayList 一起使用,通过使用我自己的 MergeSort 方法按字母顺序对其进行排序(Actor class 包含参数名称,这是我用来对数组进行排序的字符串) .我目前正在尝试使此方法适用于包含 [d,a,b,l,z,x,y,c,w] 的非常简单的数组。它工作正常,但 "l" 总是走到最后,无论起始顺序是什么。如果我用真正的演员 arrayList(包含真实姓名)尝试它,它实际上并没有对任何东西进行排序。
非常感谢您的帮助:)
编辑 1:澄清代码。对于某些评论它的人,我也不需要我要排序的数组大小为 0 的情况。
编辑 2:永远不会有 2 个同名演员,因为他们会在我的程序的前一阶段合并。
问题出在 SortArray()
的 actorsArrayList.size()>2
案例中。您正在将每个部分排序到新的 ArrayList
中,但忘记在调用 MergeArrays()
时使用排序后的列表。像这样修复:
part1 = SortArray(part1);
part2 = SortArray(part2);
所以,这是我的代码:
public ArrayList<Actor> SortArray(ArrayList<Actor> actorsArrayList){
if (actorsArrayList.size()==2){
if (actorsArrayList.get(0).getName().compareTo(actorsArrayList.get(1).getName())>0){
Actor tmpActor = actorsArrayList.get(0);
actorsArrayList.set(0, actorsArrayList.get(1));
actorsArrayList.set(1, tmpActor);
}
}if (actorsArrayList.size()>2){
ArrayList<Actor> part1 = new ArrayList<Actor> (actorsArrayList.subList(0, actorsArrayList.size()/2));
ArrayList<Actor> part2 = new ArrayList<Actor> (actorsArrayList.subList(actorsArrayList.size()/2, actorsArrayList.size()));
SortArray(part1);
SortArray(part2);
actorsArrayList = MergeArrays(part1,part2);
}
return actorsArrayList;
}
public ArrayList<Actor> MergeArrays(ArrayList<Actor> part1, ArrayList<Actor> part2){
ArrayList<Actor> mergedArray = new ArrayList<Actor>();
int i = 0;
int j = 0;
while (i<part1.size() && j<part2.size()){
if (part1.get(i).getName().compareTo(part2.get(j).getName())<0){
mergedArray.add(part1.get(i));
i=i+1;
}else if (part1.get(i).getName().compareTo(part2.get(j).getName())>0){
mergedArray.add(part2.get(j));
j=j+1;
}
}
while (i<part1.size()){
mergedArray.add(part1.get(i));
i=i+1;
}
while (j<part2.size()){
mergedArray.add(part2.get(j));
j=j+1;
}
return mergedArray;
}
此代码旨在与巨大的 ActorsArrayList 一起使用,通过使用我自己的 MergeSort 方法按字母顺序对其进行排序(Actor class 包含参数名称,这是我用来对数组进行排序的字符串) .我目前正在尝试使此方法适用于包含 [d,a,b,l,z,x,y,c,w] 的非常简单的数组。它工作正常,但 "l" 总是走到最后,无论起始顺序是什么。如果我用真正的演员 arrayList(包含真实姓名)尝试它,它实际上并没有对任何东西进行排序。
非常感谢您的帮助:)
编辑 1:澄清代码。对于某些评论它的人,我也不需要我要排序的数组大小为 0 的情况。
编辑 2:永远不会有 2 个同名演员,因为他们会在我的程序的前一阶段合并。
问题出在 SortArray()
的 actorsArrayList.size()>2
案例中。您正在将每个部分排序到新的 ArrayList
中,但忘记在调用 MergeArrays()
时使用排序后的列表。像这样修复:
part1 = SortArray(part1);
part2 = SortArray(part2);