import java.util.ArrayList;
public class BubbleSort {
// the sort method takes in an ArrayList of Strings, sorts
// them in ascending number of characters, and returns a new
// ArrayList of Strings which is already sorted. This method
// does NOT modify the original ArrayList passed in.
public ArrayList<String> sort(ArrayList<String> a){
ArrayList<String> sortingList = new ArrayList<String>();
sortingList = a;
String test = "";
String test2 = "";
int length = 0;
int length2 = 0;
for(int j =0; j<a.size(); j++){
for (int i =0; i<sortingList.size()-1; i++){
test = a.get(i);
test2 = a.get(i+1);
length = test.length();
length2 = test2.length();
if(length2<length){
sortingList.set(i,test2);
sortingList.set(i+1,test);
}
}
}
return sortingList;
}
}
=================================主要方法========= ============================
import java.util.ArrayList;
import java.util.Scanner;
public class BubbleSortTest {
public static void main(String[] args) {
ArrayList<String> inputs = new ArrayList<String>();
// get inputs from user
Scanner sc = new Scanner(System.in);
System.out.print("Enter number of Strings to enter: ");
int no = sc.nextInt();
sc.nextLine(); // clears buffer in Scanner
for (int i = 0; i < no; i++){
System.out.print("Enter String number " + i + ": ");
inputs.add(sc.nextLine()); // add input into ArrayList
}
// invoke the sort method to see if it works
BubbleSort bs = new BubbleSort();
ArrayList<String> sortedInputs = bs.sort(inputs);
// print out the Strings in sortedInputs
System.out.println("Sorted sequence:");
for (int i = 0; i < sortedInputs.size(); i++){
System.out.println(sortedInputs.get(i));
}
// print out the Strings in the original inputs
System.out.println("Original sequence:");
for (int i = 0; i < inputs.size(); i++){
System.out.println(inputs.get(i));
}
}
}
输入示例
121234256464534
1123123
123141243124124
123
我的排序顺序&amp; 原始序列都以升序进行修改,即使我创建了一个新的arraylist返回 同时确保我没有对原始版本进行任何更改。
提前致谢
答案 0 :(得分:5)
sortingList = a;
两个引用,sortingList和a都指向同一个ArrayList对象
检查此问题,了解如何查看如何克隆列表:How to clone ArrayList and also clone its contents?
答案 1 :(得分:1)
只需从代码中删除此行
即可 ArrayList<String> sortingList = new ArrayList<String>();
sortingList = a; //REMOVE THIS LINE
当您在前一行但在下一行中分配新的arraylist对象时,您将在 sortingList 对象中存储对原始对象的引用。
如果您要将所有元素复制到 sortingList ,请查看Evans Post,但在您的示例中,您不需要它,因为您正在分配测试和原始Array提供的 test2 变量。
答案 2 :(得分:1)
正如阿克塞尔指出的那样,使用:
ArrayList<String> sortingList = new ArrayList<String>(a);
通过该更改,在BubbleSort类中,您仍在引用“a”数组中的字符串,因此它们未正确排序。要修复,请更改:
test = a.get(i);
test2 = a.get(i+1);
到
test = sortingList.get(i);
test2 = sortingList.get(i+1);
完整代码:
public ArrayList<String> sort(ArrayList<String> a){
//As Axel pointed, use:
ArrayList<String> sortingList = new ArrayList<String>(a);
String test = "";
String test2 = "";
int length = 0;
int length2 = 0;
for(int j =0; j<sortingList.size(); j++){
for (int i =0; i<sortingList.size()-1; i++){
//reference "sortingList" array instead of "a" array
test = sortingList.get(i);
test2 = sortingList.get(i+1);
length = test.length();
length2 = test2.length();
if(length2<length){
sortingList.set(i,test2);
sortingList.set(i+1,test);
}
}
}
return sortingList;
}