如何根据poja类值删除列表中的项目

时间:2016-02-12 12:29:33

标签: java list

如何从列表中删除列表项,如下所示

  <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删除项目。

我怎样才能实现这个目标?

5 个答案:

答案 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();
    }
}