2012-03-29 35 views
13

Tôi đã sửa nó. Heres mã mới của tôi.Trừ một arrayList khỏi một arrayList

//returns a new IntSet after subtracting a from b 
// .minus().toString() 
ArrayList<Integer> minusArray = new ArrayList<Integer>(); 

    minusArray.addAll(array1); 

    for(int i =0; i< minusArray.size(); i++){ 
     for(int j = 0; j < array2.size(); j++){ 
      if(minusArray.get(i).equals(array2.get(j))){ 
       minusArray.remove(i); 
       if(i == 0){ 
        ; 
       } 
       else if(j == 0){ 
        ; 
       } 
       else{ 
        i = 0; 
        j = 0; 
       } 
      } 
      else{} 
     } 
    } 

return minusArray; 

Tôi có hai arrayLists và tôi đang cố gắng "trừ" một arrayList khỏi một danh sách khác. Ví dụ: nếu tôi có một arrayList [1,2,3] và tôi đang cố gắng trừ [0, 2, 4] kết quả arrayList phải là [1,3].

Mã của tôi hoạt động trong một số trường hợp, như nếu arrayList1 = [4,6]arrayList2 = [6] nó sẽ cho tôi kết quả là [4]. Nhưng nếu tôi cố gắng một cái gì đó giống như [1,2,4][0,4,8]

tôi nhận được ngoại lệ này:

java.lang.IndexOutOfBoundsException: Index: 2, Size: 2 
    at java.util.ArrayList.rangeCheck(Unknown Source) 
    at java.util.ArrayList.get(Unknown Source) 
    at IntSet.minus(IntSet.java:119) 
    at IntSetDriver.main(IntSetDriver.java:62) 

Đây là mã tôi đã đưa ra. Tôi đã làm thử nghiệm chạy qua nó và với tôi tôi nghĩ rằng nó sẽ làm việc. Người dùng nhập các arrayLists này và chúng được phân loại, tôi cũng không biết Hash hoặc big-O.

ArrayList<Integer> minusArray = new ArrayList<Integer>(); 

    minusArray.addAll(array1); 

    for(int i =0; i< minusArray.size(); i++){ 
     for(int j = 0; j < array2.size(); j++){ 
      if(minusArray.get(i).equals(array2.get(j))){ 
       minusArray.remove(i); 
      } 
      else{} 
     } 
    } 

return minusArray; 

Trả lời

2

Vấn đề của bạn là trong hàm minusArray.remove (...) gọi bạn có thể thu nhỏ kích thước của minusArray. Để khắc phục điều này, hãy bắt đầu tại array.size() - 1 và đếm ngược về 0

Kiểm tra xem - ngay cả điều đó cũng không khắc phục được. Bạn cần phải đảo ngược thứ tự các vòng của bạn

28

Hãy thử sử dụng phương pháp trừ của lớp org.apache.commons.collections.CollectionUtils.

Trả về Bộ sưu tập mới chứa a - b. Phần tử số của mỗi phần tử e trong Bộ sưu tập được trả về sẽ là bản số của e trong một trừ đi bản số của e bằng b, hoặc bằng không, tùy theo số nào lớn hơn.

CollectionUtils.subtract (java.util.Collection một, java.util.Collection b)

Từ Apache Commons Collections

+0

CS 251 là gì? – kukis

+2

@kukis CS 251 sẽ là khóa học khoa học máy tính năm thứ hai tại một số trường đại học. –

2

Tôi đoán bạn sẽ có được các vấn đề phạm vi bởi vì bạn đã loại bỏ một trong những yếu tố mà thay đổi những gì vòng lặp bên trong đang tìm kiếm (tôi biết vấn đề này xảy ra khi giao dịch với danh sách bình thường và bộ sưu tập).

Những gì tôi phải làm trong quá khứ để giải quyết vấn đề này là tạo danh sách các mục cần xóa (đó là những mục được tìm thấy trong danh sách gốc). Lặp lại thông qua danh sách mới đó và trực tiếp loại bỏ các phần tử của danh sách gốc mà không cần phải có một trình vòng lặp di chuyển qua nó.

6

Vượt qua các minusArray sử dụng một chỉ số là một cách để làm điều này, nhưng tôi đề nghị bạn tận dụng các phương pháp contains(Object), mà sẽ cho phép bạn sử dụng remove(Object) cho các phần tử cụ thể của array2.

Tất nhiên, luôn có những removeAll(Collection) mà làm khá nhiều tất cả mọi thứ bạn cần ...

+0

+1 cho cách "bình thường" để thực hiện việc này. –

4

Bạn có thể sử dụng org.apache.commons.collections.ListUtils và làm tất cả những gì bạn muốn chỉ trong một dòng =)

List resultList = ListUtils.subtract(list, list2); 
22

Có lý do nào khiến bạn không thể sử dụng List.removeAll (List) không?

List<Integer> one = new ArrayList<Integer>(); 
    one.add(1); 
    one.add(2); 
    one.add(3); 
    List<Integer> two = new ArrayList<Integer>(); 
    two.add(0); 
    two.add(2); 
    two.add(4); 
    one.removeAll(two); 
    System.out.println(one); 

    result: "[1, 3]"