2011-12-15 37 views
13

Làm cách nào để xóa đối tượng cụ thể khỏi ArrayList? Giả sử tôi có một lớp học như sau:Làm thế nào để loại bỏ đối tượng cụ thể khỏi ArrayList trong Java?

import java.util.ArrayList;  
public class ArrayTest { 
    int i; 

    public static void main(String args[]){ 
     ArrayList<ArrayTest> test=new ArrayList<ArrayTest>(); 
     ArrayTest obj; 
     obj=new ArrayTest(1); 
     test.add(obj); 
     obj=new ArrayTest(2); 
     test.add(obj); 
     obj=new ArrayTest(3); 
     test.add(obj); 
    } 
    public ArrayTest(int i){ 
     this.i=i; 
    } 
} 

Làm thế nào tôi có thể loại bỏ đối tượng với new ArrayTest(1) từ ArrayList<ArrayList>

Trả lời

20

ArrayList loại bỏ đối tượng của tôi dựa trên phương pháp equals(Object obj). Vì vậy, bạn nên thực hiện đúng phương pháp này. Một cái gì đó như:

public boolean equals(Object obj) { 
    if (obj == null) return false; 
    if (obj == this) return true; 
    if (!(obj instanceof ArrayTest)) return false; 
    ArrayTest o = (ArrayTest) obj; 
    return o.i == this.i; 
} 
7

Nói chung một đối tượng có thể được loại bỏ trong hai cách từ một ArrayList (hay nói chung là bất kỳ List), bởi chỉ số (remove(int)) và đối tượng (remove(Object)).

Trong trường hợp cụ thể này: Thêm phương thức equals(Object) vào lớp ArrayTest của bạn. Điều đó sẽ cho phép ArrayList.remove(Object) xác định đối tượng chính xác.

0
ArrayTest obj=new ArrayTest(1); 
    test.add(obj); 
    ArrayTest obj1=new ArrayTest(2); 
    test.add(obj1); 
    ArrayTest obj2=new ArrayTest(3); 
    test.add(obj2); 

    test.remove(object of ArrayTest); 

bạn có thể chỉ định cách bạn kiểm soát từng đối tượng.

+0

nhưng làm cách nào tôi có thể nhận đối tượng của ArrayTest giống như trước ......... – sanu

0

sử dụng mã này

test.remove(test.indexOf(obj)); 

test is your ArrayList and obj is the Object, first you find the index of obj in ArrayList and then you remove it from the ArrayList. 
+0

nếu có vị trí bất thường thì làm cách nào tôi có thể lấy chỉ mục của obj. – sanu

+0

tha thứ cho tôi nếu tôi không thể hiểu được quan điểm của bạn. nhưng bạn không cần cung cấp chỉ mục, bạn cần truyền đối tượng tới phương thức indexOf và nó sẽ trả về chỉ mục đối tượng và phương thức remove sẽ loại bỏ chỉ mục này khỏi ArrayList. Nếu bạn có các đối tượng trùng lặp có cùng giá trị thì bạn cần phải thực hiện phương thức equals trong lớp của bạn. –

+0

nhưng trong trường hợp này indexOf (obj) giữ lại giá trị chỉ số của đối tượng cuối cùng đó là ArrayTest (3) ..... vì vậy nó sẽ loại bỏ đối tượng cuối cùng – sanu

0

AValchev là đúng. Giải pháp nhanh hơn là phân tích tất cả các phần tử và so sánh với thuộc tính duy nhất.

String property = "property to delete"; 

for(int j = 0; j < i.size(); j++) 
{ 
    Student obj = i.get(j); 

    if(obj.getProperty().equals(property)){ 
     //found, delete. 
     i.remove(j); 
     break; 
    } 

} 

Đây là giải pháp nhanh. Bạn nên thực hiện tốt hơn so sánh đối tượng cho các dự án lớn hơn.

+0

Điều gì sẽ xảy ra nếu bạn muốn xóa nhiều đối tượng phù hợp với thuộc tính? – tmh

0

Bạn có thể sử dụng Collections.binarySearch để tìm phần tử, sau đó gọi xóa trên chỉ mục được trả lại.

Xem tài liệu cho Collections.binarySearch đây: http://docs.oracle.com/javase/1.4.2/docs/api/java/util/Collections.html#binarySearch%28java.util.List,%20java.lang.Object%29

này sẽ yêu cầu các đối tượng ArrayTest có Equals thực hiện mặc dù. Bạn cũng cần gọi Collections.sort để sắp xếp danh sách. Cuối cùng, ArrayTest sẽ phải thực hiện giao diện Comparable, do đó binarySearch sẽ chạy đúng.

Đây là cách "thích hợp" để thực hiện điều đó trong Java. Nếu bạn chỉ đang tìm cách giải quyết vấn đề một cách nhanh chóng và bẩn thỉu, thì bạn chỉ có thể lặp qua các phần tử và loại bỏ một phần với thuộc tính mà bạn đang tìm kiếm.

0

này đã giúp tôi:

 card temperaryCardFour = theDeck.get(theDeck.size() - 1); 
     theDeck.remove(temperaryCardFour);  

thay vì

theDeck.remove(numberNeededRemoved); 

Tôi có một cấu loại bỏ trên đoạn đầu tiên của mã và một cấu loại bỏ un ​​ngày thứ hai.

Hãy thử chuyển đổi mã của bạn bằng đoạn đầu tiên tôi nghĩ đó là vấn đề của bạn.

Nathan Nelson

0

Để xóa đối tượng cụ thể khỏi mảngList có hai cách. Gọi hàm của arrayList.

  1. Xóa trên cơ sở của đối tượng.
arrayList.remove(object); 

này sẽ loại bỏ đối tượng của bạn, nhưng trong nhiều trường hợp khi ArrayList chứa các hạng mục UserDefined kiểu dữ liệu, phương pháp này không cung cấp cho bạn kết quả chính xác. Nó hoạt động tốt chỉ cho Primitive DataTypes. Bởi vì người dùng muốn loại bỏ các mục trên cơ sở giá trị trường đối tượng và không thể được so sánh bằng cách loại bỏ chức năng tự động.

  1. Xóa trên cơ sở vị trí chỉ mục được chỉ định của arrayList. Cách tốt nhất để loại bỏ bất kỳ mục hoặc đối tượng nào khỏi arrayList. Trước tiên, hãy tìm chỉ mục của mục mà bạn muốn xóa. Sau đó gọi phương thức arrayList này, phương thức này loại bỏ mục trên cơ sở chỉ mục. Và nó sẽ cho kết quả chính xác.
arrayList.remove(index); 
0

Nếu bạn đang sử dụng Java 8:

test.removeIf(t -> t.i == 1); 

Java 8 có một phương pháp removeIf trong giao diện bộ sưu tập. Đối với ArrayList, nó có một thực hiện nâng cao (thứ tự của n).

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