删除ArrayList中具有特定大小的元素

时间:2015-12-09 18:58:45

标签: java for-loop arraylist size

所以我目前仍然坚持我的一个程序。我必须使用for循环来删除ArrayList中大于4的所有元素。我不知道如何做到这一点。有人帮忙吗?

这是我的代码:

import java.util.ArrayList;
public class P4E
{
    public static void main( String args[] )
        {
            ArrayList<String> universities = new ArrayList<String>();
            universities.add("Princeton");
            universities.add("UCSD");
            universities.add("UCLA");
            universities.add("SDSU");
            universities.add("UCI");
            int size = universities.size();
            System.out.println( "The size of the ArrayList is: " + size);
            System.out.println("");
            System.out.println("Now using a for-each loop");
            System.out.println("");
            for (String a : universities)
                {
                    System.out.println( a );
                }//end for-each
            System.out.println( "" );
            System.out.println( "Now using a for loop" );
            System.out.println( "" );
            for (int i = 0; i < universities.size(); i++)
                {
                    if (universities.get(i) > 4 )
                        {
                           universities.remove(i); 
                        }//end if-statement
                }//end for loop
        }//end main
}

6 个答案:

答案 0 :(得分:2)

removeIf上使用Java 8 List默认方法:

universities.removeIf(u -> u.length() > 4);

答案 1 :(得分:1)

如果您尝试删除大于4个字符的元素,则可以使用:

for (int i = 0; i < universities.size(); i++)
{
    System.out.println("checking "+universities.get(i));
    if (universities.get(i).length() > 4 )
        {
           universities.remove(i);
           i--;
        }//end if-statement
}//end for loop

.length()是必要的,因为您对string的尺寸感兴趣,您无法直接将stringint进行比较。 i--;确保您不会在列表大小发生变化时跳过元素。

System.out.println会向您显示正在检查的元素,因此您可以看到您正确地浏览了列表。

答案 2 :(得分:0)

而不是<?php if(isset($_POST['id'] && isset($_POST['name'])) { $id = $_POST['id']; $name = $_POST['name']; mysql_pconnect('localhost', 'root', ''); mysql_select_db('my_db'); $query = "UPDATE users SET name = '$name' WHERE id = $id"; $result = mysql_query($query); if($result){ echo 'response=update successful'; } else { echo 'response=update failed'; } } ?>

这样做:

if(universities.get(i) > 4)

<强>原因

在这种情况下,您想要在for (int i = size; i >= 0; i--) { if (i > 4 ) universities.remove(i); // Shorten to only 1 line instead of brackets }//end for loop 点移除大学,而不是获取大学对象。当您调用i时,它将返回universities.get(i) ArrayList

中的Object

答案 3 :(得分:0)

您的代码存在的问题是i即使在remove()调用后也会前进到下一个值,这意味着您的代码会跳过某些项目。

以下是正在发生的事情:假设您要删除此列表中的所有数字4及以上:{9 5 7 4 3}。当i为零时,您的算法会找到9并将其删除。现在i1,但您的列表为{5 7 4 3},因此永远不会再次检查索引为零的5

一种解决方案是以相反的顺序迭代:

for (int i = universities.size() - 1; i >= 0 ; i--) {
    if (universities.get(i).length() > 4 ) {
        universities.remove(i); 
    }//end if-statement
}//end for loop

既然i关闭而不是上升,那么列表是否缩小并不重要。

答案 4 :(得分:0)

当前代码问题在于你每次都增加i,而有时你会删除导致左侧元素索引被移位的元素。这导致您跳过检查某些元素的事实。例如:

初始数组:[5,6,7],索引i = 0。 你删除了索引0处的元素 - 数组变为[6,7],然后你增加i并且它变为1 - 所以要检查的下一个元素的索引是1,这个reffer为7,而不是6.结果 - 你没有&#39;检查6。

解决方案:

1)在i--;

之后立即添加universities.remove(i);

2)按降序迭代:for (int i = 0; i < universities.size(); i++) - &gt; for (int i = universities.size() - 1; i >= 0; i--)

3)使用java流:

universities = universities.stream()
                           .filter(e -> e > 4)
                           .collect(Collectors.toList());

答案 5 :(得分:0)

你到底大于4是什么意思?如果你的字符串长度大于4,那么这就是解决方案。用下面的代码替换第二个for循环。

int i = 0;
while(i<universities.size()) {
    if (universities.get(i).length() > 4 ) {
        universities.remove(i); 
    } else {
        i++;
    }
}