Java如何有效地从列表中删除元素
好的,这是我头上的概念证明,已经困扰了我好几天了: 假设我有:Java如何有效地从列表中删除元素,java,list,Java,List,好的,这是我头上的概念证明,已经困扰了我好几天了: 假设我有: List<String> a = new ArrayList<String>(); a.add("foo"); a.add("buzz"); a.add("bazz"); a.add("bar"); for (int i = 0; i < a.size(); i++) { String str = a.get(i); if (!str.equals("foo") || !str.equ
List<String> a = new ArrayList<String>();
a.add("foo");
a.add("buzz");
a.add("bazz");
a.add("bar");
for (int i = 0; i < a.size(); i++)
{
String str = a.get(i);
if (!str.equals("foo") || !str.equals("bar")) a.remove(str);
}
List a=new ArrayList();
a、 添加(“foo”);
a、 添加(“嗡嗡声”);
a、 添加(“bazz”);
a、 添加(“酒吧”);
对于(int i=0;i
这将以列表[“foo”、“bazz”、“bar”]结束,因为它将读取索引1(“buzz”)处的字符串,删除它,索引2(“bazz”)处的字符串将跳转到索引1,并且将绕过它而不进行验证
我想到的是:
List<String> a = new ArrayList<String>();
a.add("foo");
a.add("buzz");
a.add("bazz");
a.add("bar");
for (int i = 0; i < a.size(); i++)
{
String str = a.get(i);
boolean removed = false;
if (!str.equals("foo") || !str.equals("bar"))
{
a.remove(str);
removed = true;
}
if (removed) i--;
}
List a=new ArrayList();
a、 添加(“foo”);
a、 添加(“嗡嗡声”);
a、 添加(“bazz”);
a、 添加(“酒吧”);
对于(int i=0;i
它应该是这样工作的(至少在我的脑海中是这样的,lol),但是使用for迭代器并不是很好的实践
我认为另一种方法是创建一个“删除列表”,并将需要从列表a中删除的项目添加到该列表中,但这只是纯粹的资源浪费
那么,有效地从列表中删除项目的最佳实践是什么呢?请改用
迭代器
并使用迭代器#remove
方法:
for (Iterator<String> it = a.iterator(); it.hasNext(); ) {
String str = it.next();
if (!str.equals("foo") || !str.equals("bar")) {
it.remove();
}
}
for(Iterator it=a.Iterator();it.hasNext();){
String str=it.next();
如果(!str.equals(“foo”)| |!str.equals(“bar”)){
it.remove();
}
}
根据你的问题: 使用for迭代器不是很好的实践 事实上,如果您直接使用
List
而不是ArrayList
,那么使用get
方法可以在所有集合中导航以获得所需的元素(例如,如果您有一个由单个链接列表支持的List
)。因此,这里的最佳实践是使用迭代器,而不是使用get
有效地从列表中删除项目的最佳实践是什么
不仅对于
列表
s,而且对于任何支持的集合
,并且假设您没有索引或某种键(如映射
)来直接访问元素,删除元素的最佳方法是使用迭代器#remove
使用迭代器
,然后使用迭代器#remove
方法:
for (Iterator<String> it = a.iterator(); it.hasNext(); ) {
String str = it.next();
if (!str.equals("foo") || !str.equals("bar")) {
it.remove();
}
}
for(Iterator it=a.Iterator();it.hasNext();){
String str=it.next();
如果(!str.equals(“foo”)| |!str.equals(“bar”)){
it.remove();
}
}
根据你的问题: 使用for迭代器不是很好的实践 事实上,如果您直接使用
List
而不是ArrayList
,那么使用get
方法可以在所有集合中导航以获得所需的元素(例如,如果您有一个由单个链接列表支持的List
)。因此,这里的最佳实践是使用迭代器,而不是使用get
有效地从列表中删除项目的最佳实践是什么
不仅对于
列表
s,而且对于任何支持的集合
,并且假设您没有索引或某种键(如映射
)来直接访问元素,删除元素的最佳方法是使用迭代器#remove
,您的第一个示例可能会导致一个错误,因为一旦你删除了一个对象,你列表的索引就会改变。如果您想快速完成,请使用迭代器
或列表自己的。remove()
函数:
Iterator<String> itr = yourList.iterator();
while (itr.hasNext()) {
if ("foo".equals(itr.next()) {
itr.remove();
}
}
您的第一个示例可能会导致一个错误,因为一旦您删除一个对象,列表的索引就会改变。如果您想快速完成,请使用
迭代器
或列表自己的。remove()
函数:
Iterator<String> itr = yourList.iterator();
while (itr.hasNext()) {
if ("foo".equals(itr.next()) {
itr.remove();
}
}
您有三个主要选择:
while
循环,并且仅在不删除项目的情况下增加索引变量
int index = 0;
while (index < list.size()) {
if (/*...you want to remove the item...*/) {
list.removeAt(index);
} else {
// Not removing, move to the next
++index;
}
}
int索引=0;
while(索引
请记住,除非您知道您正在处理
ArrayList
,否则List#get(int)
的成本可能很高(可能是一次遍历)。但是如果您知道您正在处理ArrayList
(或类似),那么…您有三个主要选择:
while
循环,并且仅在不删除项目的情况下增加索引变量
int index = 0;
while (index < list.size()) {
if (/*...you want to remove the item...*/) {
list.removeAt(index);
} else {
// Not removing, move to the next
++index;
}
}
int索引=0;
while(索引
请记住,除非您知道您正在处理
ArrayList
,否则List#get(int)
的成本可能很高(可能是一次遍历)。但是,如果您知道您正在处理ArrayList
(或类似),那么…ArrayList.retainal
有一个“智能”实现,它做的事情是线性时间。您只需使用list.retainal(Arrays.asList(“foo”,“bar”))
,就可以在这一行中获得快速实现。ArrayList.retainal
有一个“智能”实现,它可以正确地实现线性时间。您只需使用list.retainal(Arrays.asList(“foo”,“bar”))
就可以在这一行中得到快速实现。您应该使用迭代器。可能是的副本确实我可以删除第二个if,但当我想到它时