删除数组列表中的空条目

时间:2016-12-16 02:50:52

标签: java

我必须摆脱数组列表中的所有空条目。它们都在最后,因为我之前调用了remove方法。因此,当我使用for循环来遍历数组以搜索空节点时(我不确定你所谓的单个单元格,如果它令人困惑),我不能说像for(int k = 0; k < arraylist.size(); k++)这样的东西,因为尺寸降低了。但我仍然需要摆脱空节点。我该怎么做呢?感谢

for(int k = 0; k < terms.size(); k++)
{
   if((terms.get(k)).length() < 1) // terms is the name of array list and there are null entries at the end of it
      terms.remove(k);
}

3 个答案:

答案 0 :(得分:3)

有很多方法可以做。这里只是一些例子

调整索引

迭代的问题是,当您从某个索引中删除元素时,其后面的元素将向上移动。

所以,

for(int k = 0; k < terms.size(); k++) {
   if((terms.get(k)).isEmpty()) {  // use isEmpty() plesae
      terms.remove(k--);  // move k back 1 element, so it points to 
                          // correct index after increment of for loop
   }
}

使用迭代器

IIRC ArrayList的迭代器支持remove(),所以你可以做到

for (Iterator<String> itr = terms.iterator(); itr.hasNext(); ) {
    if (itr.next().isEmpty()) {
        itr.remove();
    }
}

进行过滤,并构造一个新的数组列表。

如果您不需要就地删除,这可能是最简单的

(假设您使用的是Java 8)

terms = terms.stream().filter(s -> ! s.isEmpty())
              .collect(Collectors.toList());

// or create another list for result, then 
// terms.clear(); terms.addAll(tempList);
// if you need to change content of terms instead

答案 1 :(得分:0)

每次调用remove时,ArrayList的大小都会缩小,因此破坏性循环不会起作用。如果保证最后放置的所有空项目的假设,我认为您可以搜索第一个内部空项目的索引,然后在找到的索引上调用subList

int k;
for(k = 0; k < terms.size(); k++)
{
    if((terms.get(k)).length() < 1) break;
}
return terms.subList(0, k)

答案 2 :(得分:0)

如果你知道完全你要删除的内容,那么你有两个选择。

您可以使用List#removeAll删除您控制的虚拟集合中的所有元素,这样做的缺点是会增加您从未使用的列表的开销......

stringList.removeAll(Arrays.asList((String)null));

...或者您可以使用Java的Stream API并通过null过滤掉所有Objects.nonNull元素。

stringList = stringList.stream().filter(Objects::nonNull)
                                .collect(Collectors.toList());

这两个选项 都不关心集合的长度。