我有一个字符串数组列表,我想删除低于一定长度的字符串。我在想这个方法:
for (int i = 0; i < result.size(); i++) {
if (result.get(i).split("\\s").length != maxLength) {
System.out.println(result.get(i));
result.remove(i);
}
}
但它只删除了几个条目,因为当它删除一个条目时,它会移动下一个条目以移除一个条目。另外一种方法是什么
答案 0 :(得分:3)
使用迭代器,例如:
final Iterator<String> x = list.iterator();
while (iterator.hasNext()) {
if (someCondition) {
iterator.remove();
}
}
答案 1 :(得分:3)
永远不要以这种方式从ArrayList中删除。改为使用Iterator:
Iterator<String> stringIterator = result.iterator();
while (stringIterator.hasNext()) {
String string = stringIterator.next();
if (string.split("\\s").length != maxLength) {
System.out.println(string);
stringIterator.remove();
}
}
答案 2 :(得分:3)
如果您碰巧使用Commons Collections:
CollectionUtils.filter(result, new Predicate()
{
@Override
public boolean evaluate(Object object)
{
return ((String) object).split("\\s").length >= maxLength;
}
}));
答案 3 :(得分:2)
尝试从最后一个迭代到第一个:
for (int i = result.size() - 1; i >= 0; i--) {
if (result.get(i).split("\\s").length != maxLength) {
System.out.println(result.get(i));
result.remove(i);
}
}
答案 4 :(得分:2)
当你删除一个时,你应该减少索引,以考虑后面的那些已经移位,如result.remove(i--);
答案 5 :(得分:1)
您需要再次修改i
以确保它涵盖数组列表的完整序列,或者首先转到最后一个&gt;,如其他答案中所示。
for (int i = 0; i < result.size(); i++) {
if (result.get(i).split("\\s").length != maxLength) {
result.remove(i);
i--; // everything has been moved up in the arraylist
}
}
此外,ArrayList需要线性时间来删除单个元素,因此重复删除是一个坏主意。
使用LinkedList,它可以在迭代期间以恒定时间移除,或者首先收集HashSet中的元素,然后使用Collection.removeAll(Collection)在最后删除它们。
对于ArrayList,removeAll方法占用与列表大小成比例的时间乘以参数集合的查找时间。使用HashSet作为参数应该最小化所需的时间。
如果只删除一些值,任何集合都可能就足够了。
LinkedList tmpLinkedList = new LinkedList(result);
for (Iterator iter = tmpLinkedList.iterator(); iter.hasNext() {
if (iter.next().split("\\s").length != maxLength))
iter.remove();
}
result.clear();
result.addAll(tmpLinkedList);
或者:
HashSet toRemove = new HashSet();
//for (Iterator iter = myarraylist.iterator(); iter.hasNext() {
for (String s : result) {
if (s.split("\\s").length != maxLength)
toRemove.add(elem);
}
result.removeAll(toRemove);
答案 6 :(得分:1)
你需要从最后开始,一路走到前面。
for (int i = result.size() - 1; i >= 0; i--) {
if (result.get(i).length < maxLength) {
System.out.println(result.get(i));
result.remove(i);
}
}
答案 7 :(得分:1)
要从集合中删除元素,您应该使用迭代器。
for (Iterator<String> iter = list.iterator(); iter.hasNext();) {
String s = iter.next();
if (s.split("\\s").length != maxLength) {
iter.remove();
}
else {
System.out.println(s);
}
}