为什么我的原始arraylist被修改,即使我只在方法中更改我的ArrayList而不更改orignal ArrayList

时间:2013-11-08 13:50:42

标签: java arraylist

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; 原始序列都以升序enter image description here进行修改,即使我创建了一个新的arraylist返回 同时确保我没有对原始版本进行任何更改。

提前致谢

3 个答案:

答案 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;
}