2011-10-27 27 views
14

Tôi có ngăn xếp A và tôi muốn tạo ngăn xếp B giống hệt ngăn xếp A. Tôi không muốn ngăn xếp B chỉ đơn giản là con trỏ đến A - Tôi thực sự muốn tạo ngăn xếp B mới chứa các phần tử giống như ngăn xếp A theo thứ tự như ngăn xếp A. Ngăn xếp A là một chuỗi các chuỗi.Làm cách nào để sao chép một ngăn xếp trong Java?

Cảm ơn!

+1

'Ngăn xếp b = (Stack ) a.clone(); ' – Marcelo

Trả lời

19

Chỉ cần sử dụng clone() -method của lớp Stack (nó triển khai Cloneable).

Dưới đây là một thử nghiệm trường hợp đơn giản với JUnit:

@Test 
public void test() 
{ 
    Stack<Integer> intStack = new Stack<Integer>(); 
    for(int i = 0; i < 100; i++)   
    { 
     intStack.push(i); 
    } 

    Stack<Integer> copiedStack = (Stack<Integer>)intStack.clone(); 

    for(int i = 0; i < 100; i++)    
    { 
     Assert.assertEquals(intStack.pop(), copiedStack.pop()); 
    } 
} 

Edit:

tmsimont: Điều này tạo ra một "hoạt động đánh dấu hoặc không an toàn" cảnh báo đối với tôi. Bất kỳ cách nào để thực hiện việc này mà không tạo ra sự cố này?

lúc đầu tôi trả lời rằng cảnh báo sẽ không thể tránh khỏi, nhưng thực sự nó là tránh sử dụng <?> (wildcard) -typing:

@Test 
public void test() 
{ 
    Stack<Integer> intStack = new Stack<Integer>(); 
    for(int i = 0; i < 100; i++) 
    { 
     intStack.push(i); 
    } 

    //No warning 
    Stack<?> copiedStack = (Stack<?>)intStack.clone(); 

    for(int i = 0; i < 100; i++) 
    { 
     Integer value = (Integer)copiedStack.pop(); //Won't cause a warning, no matter to which type you cast (String, Float...), but will throw ClassCastException at runtime if the type is wrong 
     Assert.assertEquals(intStack.pop(), value); 
    } 
} 

Về cơ bản tôi muốn nói rằng bạn vẫn đang làm một diễn viên không được kiểm soát từ ? (loại không xác định) đến Integer, nhưng không có cảnh báo. Cá nhân, tôi vẫn muốn truyền trực tiếp vào Stack<Integer> và ngăn chặn cảnh báo với @SuppressWarnings("unchecked").

+0

đây là thực sự hữu ích, cảm ơn! –

+0

Điều này tạo ra cảnh báo "hoạt động không được kiểm tra hoặc không an toàn" cho tôi. Bất kỳ cách nào để làm điều này mà không tạo ra vấn đề này? – tmsimont

+1

@tmsimont: bỏ qua nhận xét trước của tôi và xem câu trả lời đã chỉnh sửa, có thể ngăn chặn cảnh báo mà không sử dụng '@SuppressWarnings (" bỏ chọn ")'. – esaj

4

Lớp Stack là lớp con của AbstractList.

Đơn giản chỉ cần đối xử với nó như một AbstractList, lặp thông qua các yếu tố trong ngăn xếp bằng cách sử dụng phương pháp get(int index), từ 0 đến chiều dài của danh sách của bạn/chồng, và thêm các yếu tố để ngăn xếp mới.

Thao tác này sẽ không sao chép các thành phần - nó sẽ thêm các phần tử vào ngăn xếp mới. Nếu bạn cũng cần sao chép các phần tử, bạn sẽ cần phải đi sâu hơn và tạo các bản sao của các phần tử và thêm các phần tử đó vào ngăn xếp mới.

Bạn có thể làm full (or "deep") copies, bằng cách sử dụng phương pháp clone, nhưng lưu ý rằng đối tượng phải triển khai giao diện Clonable để nhận deep copies of objects.

18

Stack kéo dài Vector, vì vậy bạn có thể chỉ mới lên một Stack mới và sử dụng .addAll(...) để sao chép các mục:

Stack<Type> newStack = new Stack<Type>(); 
newStack.addAll(oldStack); 
+0

wow đã không nghĩ về điều đó, cảm ơn! –

+3

Thao tác này sẽ không sao chép các mục thành viên. Cả hai ngăn xếp sẽ trỏ vào cùng một chuỗi. –

+2

Chuỗi không thay đổi, do đó, tạo một bản sao của chuỗi không giúp được gì. – msandiford

Các vấn đề liên quan