![](/img/trans.png)
[英]Java how to remove an object from one ArrayList while adding it to another?
[英]How to remove one instance of an object using Java ArrayList
如果我有兩個 ArrayList list
和toremove
,我想刪除list
上與toremove
上的對象相等的所有對象。 但只有一次(對象的一個實例)。 如何在 Java 中實現這一點? 如果它在list
中,我是否必須手動循環所有toremove
刪除的對象並將其刪除?
我試過.removeAll(toremove);
但如果對象,它會刪除每個實例。
例如,如果我有book1 book1 book2 book3
,而我的toRemove
列表是 book1 book1 book2
。 output 將是book1 book3
。
private List<Book> removeList(List<Book> initial,List<Book> toremove) {
List<Book> list=initial;
for (Book book : List) {
}
return List;
}
只需使用這個:
for (Book b : toremove) {
int index = list.indexOf(b);
if (index != -1) list.remove(index);
}
這會找到 object 的索引,然后只要該書存在於list
中,就使用該索引將其刪除。
當然,正如 sc0der 所說,您必須重寫Book
class 的 equals 方法,但我懷疑您已經這樣做了,因為removeAll
確實可以刪除所有對象。
示例輸入:
list = new ArrayList<>();
list.add(book1);
list.add(book1);
list.add(book2);
list.add(book1);
list.add(book3);
toremove = Arrays.asList(new Book[]{book1, book2});
示例 output:
list = [book1, book1, book3]
覆蓋書籍 class 中的equals()
static class Book {
int id;
String title;
public Book(int id, String title) {
this.id = id;
this.title = title;
}
@Override
public boolean equals(Object obj) {
Book other = (Book) obj;
return this.title.equals(other.title);
}
@Override
public String toString() {
return id + ": " + title;
}
}
並使用remove()
列表中第一次出現的 object
public static void main(String[] a) {
Book b1 = new Book(1, "book1");
Book b2 = new Book(1, "book1");
Book b3 = new Book(3, "book2");
Book b4 = new Book(4, "book3");
List<Book> list = new ArrayList<>();
list.add(b1);
list.add(b2);
list.add(b3);
list.add(b4);
removeFirstOccurance(list, Arrays.asList(b1, b3));
System.out.println(list);
}
private static void removeFirstOccurance(List<Book> list, List<Book> toRemove) {
for (Book b : toRemove) {
list.remove(b);
}
}
, output
[1: book1, 4: book3]
你可以這樣做:
private static List<Book> removeList(List<Book> initial, List<Book> toRemove) {
List<Book> toBeReturned = new ArrayList<Book>(initial);
List<Book> deleted = new ArrayList<Book>();
Iterator<Book> itr = toBeReturned.iterator();
while (itr.hasNext()) {
Book a = itr.next();
for (Book b : toRemove) {
if (b.equals(a) && !deleted.contains(b)) {
deleted.add(b);
itr.remove();
}
}
}
return toBeReturned;
}
演示:
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Objects;
class Book {
int id;
public Book(int id) {
this.id = id;
}
@Override
public int hashCode() {
return Objects.hash(id);
}
@Override
public boolean equals(Object obj) {
Book other = (Book) obj;
return this.id == other.id;
}
@Override
public String toString() {
return "Book [id=" + id + "]";
}
}
public class Main {
public static void main(String[] args) {
List<Book> initial = new ArrayList<Book>();
initial.add(new Book(1));
initial.add(new Book(1));
initial.add(new Book(1));
initial.add(new Book(2));
initial.add(new Book(2));
initial.add(new Book(3));
List<Book> toRemove = new ArrayList<Book>();
toRemove.add(new Book(1));
toRemove.add(new Book(2));
List<Book> list = removeList(initial, toRemove);
// Display list
list.stream().forEach(System.out::println);
}
private static List<Book> removeList(List<Book> initial, List<Book> toRemove) {
List<Book> toBeReturned = new ArrayList<Book>(initial);
List<Book> deleted = new ArrayList<Book>();
Iterator<Book> itr = toBeReturned.iterator();
while (itr.hasNext()) {
Book a = itr.next();
for (Book b : toRemove) {
if (b.equals(a) && !deleted.contains(b)) {
deleted.add(b);
itr.remove();
}
}
}
return toBeReturned;
}
}
Output:
Book [id=1]
Book [id=1]
Book [id=2]
Book [id=3]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.