如何从列表中删除列表项,如下所示
<div id="someDiv">
Hello
</div>
<div id="anotherDiv">
Hi, How are you?
</div>
<br><br>
<input id="someInput" type="text">
<input type="button" value="Say Hello" onClick="doStuff()">
<br>
我可以使用迭代器,如下所示,
List<Mypojaclass> results = new ArrayList<>();
// in the results i am adding more items using sql query, after that,
if(Mypojaclass sensor : results){
if(sensor.getType.equals("JD"){
sensor.remove(sensor);
}
}
但我应该基于该sensor.getType删除项目。
我怎样才能实现这个目标?
答案 0 :(得分:5)
使用Java 8,您可以这样做:
results = results.stream().filter(p ->! p.getType().equals("JD")).collect(Collectors.toList());
对于Java 7及以下版本,最安全的选择是:
Iterator<Mypojaclass> itr = results.iterator();
while(itr.hasNext()){
Mypojaclass item = itr.next();
if("JD".equals(item.getType())){
itr.remove();
}
}
答案 1 :(得分:3)
我决定给出答案,因为其他人似乎很难与列表,迭代器,流等等进行斗争。
首先,问题是:
像这样的代码段
List<Mypojaclass> results = ...;
for (Mypojaclass sensor : results) {
if (sensor.getType.equals("JD") {
results.remove(sensor); // <-- possible CME here
}
}
是错误的,因为它只能抛出ConcurrentModificationException
。原因是for-each-loop使用了一个迭代器,所以上面的代码等同于下面使用显式迭代器的代码:
List<Mypojaclass> results = ...;
for (Iterator<Mypojaclass> itr = result.iterator(); itr.hasNext(); ) {
Mypojaclass sensor = itr.next();
if (sensor.getType.equals("JD") {
results.remove(sensor);
}
}
请注意,您在列表中调用remove
,而不是在迭代器上调用remove
。迭代器然后抛出CME,因为列表在外部更改了迭代器。
解决方案:
在迭代器上调用List<Mypojaclass> results = ...;
for (Iterator<Mypojaclass> itr = result.iterator(); itr.hasNext(); ) {
Mypojaclass sensor = itr.next();
if (sensor.getType.equals("JD") {
itr.remove();
}
}
操作:
results.removeIf(s -> s.getType().equals("JD"));
现在,此代码段在整个列表中迭代一次,同时删除所有类型等于“JD”的传感器。
Java 8代码:
正如我们现在处于Java 8时代,这将在Java 8中做同样的事情:
List<Mypojaclass> filtered = results
.stream()
.filter(s -> !s.getType().equals("JD"))
.collect(Collectors.toList());
results = filtered;
或者 - 借助流和一些过滤:
list= [("myQuestion","answer"),("question2", "answer2")]
请注意,过滤谓词必须被否定。您不希望拥有“JD”类型。你想拥有所有其他类型。
答案 2 :(得分:2)
对于Java 8:
results.removeIf(f -> f.getType().equals("JD"));
从列表中删除类型为“JD”
的所有项目对于普通Java 7:
List<Mypojaclass> filteredResults = new ArrayList<>();
for (Mypojaclass item: results) {
if (!item.getType().equals("JD")) {
filteredResults.add(item);
}
}
替代
Iterator<Mypojaclass> iterator = results.iterator();
while (iterator.hasNext()) {
Mypojaclass item = iterator.next();
if (item.getType().equals("JD")) {
iterator.remove();
}
}
现已过滤的结果包含已过滤的列表。 对于Java 7,您还可以考虑使用commons-collections,其中包含实现这些过滤机制的方法。
results.stream().filter(p -> p.getType().equals("JD"));
从上面的评论什么也没做。您需要在新列表中收集项目,并且必须否定过滤谓词,否则您最终会得到一个只包含类型为“JD”的元素的集合
答案 3 :(得分:0)
我知道这不是最好的,但我认为它有效
List<Mypojaclass> results = new ArrayList<Mypojaclass>();
Mypojaclass [] placeHolder = null; //this will hold the object(s) to be removed
int length = 0; //this will hold the length of this new array of placeHolder array
for (Mypojaclass sensor : results) {
if(sensor.getType.equals("JD"){
length++;
}
}
placeHolder = new Mypojaclass[length]; //allocates memory
for (Mypojaclass sensor : results){
if(sensor.getType.equals("JD"){
placeHolder[length-1] = sensor; //initialize
length--;
}
}
//This will remove all instances when getType equals "JD"
for(int i = 0; i < placeHolder.length; i++){
results.remove(placeHolder[i]);
}
答案 4 :(得分:-1)
只需使用for循环:
List<Mypojaclass> results = new ArrayList<>();
// in the results i am adding more items using sql query, after that,
for(int i = 0; i < results.size(); i++) {
if(results.get(i).getType.equals("JD"){
results.remove(i);
}
}
或者直接使用Iterator:
List<Mypojaclass> results = new ArrayList<>();
// in the results i am adding more items using sql query, after that,
Iterator<Mypojaclass> iterator = results.iterator()
while(iterator.hasNext()) {
if(iterator.next().getType().equals("JD"){
iterator.remove();
}
}