使用某些 Object 属性从 ArrayList 中删除对象
Posted
技术标签:
【中文标题】使用某些 Object 属性从 ArrayList 中删除对象【英文标题】:Remove object from ArrayList with some Object property 【发布时间】:2016-07-01 22:31:22 【问题描述】:我正在维护一个ArrayList
对象。我的对象结构是 ID、名称和其他一些细节。我需要删除一个具有某些 id 值 say(10) 的对象,并且我不想遍历列表。有什么解决办法吗?
【问题讨论】:
【参考方案1】:使用 Java-8 Collection#removeIf
myList.removeIf(obj -> obj.id == 10);
对于 Java-7,您必须使用迭代器:
for(Iterator<MyType> iterator = myList.iterator(); iterator.hasNext(); )
if(iterator.next().id == 10)
iterator.remove();
请注意,列表迭代在任何情况下都是必要的。在 Java-8 removeIf
方法中,它只是在内部执行。
【讨论】:
@Tagir Valeev 非常感谢您的有效回复。没有迭代有什么办法吗??? @django 检查 Java-8 的可能性。 这两个都涉及迭代列表。 @Tagir Valeev ..Ya 它正在工作。还有一个疑问,我需要获取 id=10 的对象,而不是删除。我该怎么办?【参考方案2】:也许我不明白这个问题,但为什么没有人建议为该用户类使用覆盖 equals
和 hashcode
?
class MyObject
final String id;
final String name;
MyObject(String id, String name)
this.id = id;
this.name = name;
@Override
public boolean equals(Object o)
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
return Objects.equals(id, ((MyObject) o).id);
@Override
public int hashCode()
return id != null ? id.hashCode() : 0;
@Override
public String toString()
return "MyObjectid='" + id + "', name='" + name + "'";
在这种情况下,您可以轻松地从列表中删除任何对象
final ArrayList<MyObject> list = new ArrayList<>();
list.add(new MyObject("id1", "name1"));
list.add(new MyObject("id2", "name2"));
list.add(new MyObject("id3", "name3"));
MyObject removeCandidate = new MyObject("id2", "name2");
list.remove(removeCandidate);
System.out.println(list);
打印上面的代码
[MyObjectid='id1', name='name1', MyObjectid='id3', name='name3']
【讨论】:
【参考方案3】:如果您真的不想遍历列表,可以使用流,但我个人更喜欢 Collection#removeIf
,就像 @TagirValeev 建议的那样
myList = myList.stream()
.filter(x -> x.id() != 10)
.collect(Collectors.toList());
【讨论】:
【参考方案4】:如果不以某种方式迭代列表,则不可能1从ArrayList
中删除元素的实例2。 ArrayList
是一个底层数组,您需要检查数组中的每个元素以查看它是否符合删除标准。从根本上讲,这需要一个循环......来迭代元素。
另外请注意,当您从数组中删除单个元素时,所有位置在被删除元素之后的元素都需要移动。平均而言,这将是数组元素的一半。
现在,您可以通过避免使用显式 for
循环的方式对这些操作进行编码,但无论您如何编码,迭代都将在幕后进行。
1 - 不完全正确。假设您有一个单独的数据结构(例如)将值映射到ArrayList
中元素的索引,那么您可以在不迭代的情况下删除这些元素。但我看不出您如何有效地管理该数据结构。
2 - 迭代不仅仅意味着使用Iterator
。对于循环,Stream
、Collections.removeIf
和其他解决方案都需要在底层迭代列表的元素。
【讨论】:
【参考方案5】:如果没有迭代器,您将无法做到这一点,您应该为此使用 Hashmap。
public class ObjectStructure
private int Id;
private String name;
//and any data field you need
生成所有的 setter 和 getter。
在
中使用这个类Hashmap<Integer, ObjectStructure> data = new HashMap<>();
您可以仅使用整数键添加和删除数据。
data.remove(10);
【讨论】:
以上是关于使用某些 Object 属性从 ArrayList 中删除对象的主要内容,如果未能解决你的问题,请参考以下文章