Hỏi đáp

Chia sẻ kiến thức, cùng nhau phát triển

Gán giá trị cho ArrayList trong java?

18:22 28-04-2017 4.581 lượt xem 4 bình luận 09:58 29-04-2017

Xin chào mọi người. em có 1 arraylist bao gồm các đối tượng (data) của em định nghĩa. giờ em muốn tạo 1 arraylist thứ 2 để copy toàn bộ của arraylist đầu tiên. nhưng khi em thay đổi giá trị của thằng thứ 2 thì thằng đầu tiên cũng bị thay đổi theo. Vậy làm thế nào để copy mà nó không thay đổi giá trị của mảng gốc ạ?

em đã thử dùng cả 2  cách như trên nhưng không hiệu quả. rất mong dc sư giúp đỡ của mọi người em cảm ơn ạ!

ArrayList <Data> arr2 = new ArrayList<Data>(arr); //tạo arr2 truyền tham số là arr
//hoặc arr2 = arr;       
arr2.get(0).ThoiGianDen--;
for(int i = 0; i < arr.size(); i++) //xuất arr
{
     arr.get(i).Xuat();
            
}

 

Bình luận

Để bình luận, bạn cần đăng nhập bằng tài khoản Howkteam.

Đăng nhập
Trần Thành Vi Thanh Member đã bình luận 23:03 28-04-2017

Do ArrayList chỉ chứa các object mà object là kiểu tham chiếu nên cho dù có sao chép (tạo mới vùng nhớ cho ArrayList) thì dữ liệu bên trong (các object) cũng tham chiếu đến nhau thôi. Để giải quyết vấn đề hoặc là bạn tìm cấu trúc dữ liệu khác để lưu trữ hoặc bạn có thể xử lý như sau:

+ Trong lớp của bạn, bạn tạo ra 1 hàm clone mục đích là để sao chép các đối tượng theo cách của bạn. Nhớ là hàm này để public và hàm này là override cho hàm clone của lớp Object.

+ Duyệt qua các phần tử của ArrayList ban đầu sau đó add mới vào ArrayList copy.

 

Đây là code minh hoạ của mình:

public class Test {
    public static void main(String[] args) {
        ArrayList<ObjectClass> arr = new ArrayList<ObjectClass>();
        arr.add(new ObjectClass(2, 3));
        arr.add(new ObjectClass(4, 5));
        
        ArrayList<ObjectClass> arr2 = new ArrayList<ObjectClass>();
        
        // Duyệt qua tất cả các phần tử của arr
        for (ObjectClass item: arr) {
            arr2.add(item.clone()); // thêm object đã được tạo mới (clone) vào arr2
        }
        
        arr2.get(0).x--;
        
        System.out.println("arr.x: " + arr.get(0).x + " arr2.x: " + arr2.get(0).x);

    }
}

// lớp do mình tạo ra
class ObjectClass
{
    public ObjectClass(int x, int y)
    {
        this.x = x;
        this.y = y;
    }
    public int x;
    public int y;
    
    @Override
    public ObjectClass clone()
    {
        // hàm clone mình tự viết mục đích là tạo ra đối tượng mới và sao chép nội dung của đối tượng cũ.
        return new ObjectClass(this.x, this.y);
    }
}
Hậu Đỗ đã bình luận 19:15 28-04-2017

Bạn dùng List thay cho ArrayList thì sẽ ra ngay: Ví dụ:

List<String> l1 = new ArrayList<String>();
l1.add("Hello");
l1.add("World");
List<String> l2 = new ArrayList<String>(l1); 
l2.add("Everybody");

Log.e("log", String.valueOf(l2.size()));//=>kq: 3
Log.e("log", String.valueOf(l1.size()));//=>kq: 2

l2.set(1, "Change");
Log.e("log", l1.get(1));//=>kq: "World"
Log.e("log", l2.get(1));//=> "Change"

 

Câu hỏi mới nhất