我必须摆脱数组列表中的所有空条目。它们都在最后,因为我之前调用了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);
}
答案 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());
这两个选项 都不关心集合的长度。