2016-12-16 82 views
-1

我必须摆脱数组列表中的所有空条目。他们都在最后,因为我之前调用了删除方法。因此,当我使用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

我不清楚你的问题。你可以发布你的代码和错误日志吗? –

+0

没有错误,但我会发布代码 – Andrew

+0

你的'ArrayList'的类型是什么? – msagala25

回答

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) 
+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 
    } 
} 

使用iterator

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 
0

如果你知道正是要删除,那么是什么你有两个选择。

您可以使用List#removeAll去除你控制一个虚拟的集合,它具有增加开销,你从来没有使用列表的缺点的所有元素...

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

...或者你可以使用Java的Stream API并通过Objects.nonNull筛选出所有null元素。

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

这些选项关心集合的长度都不是。