所以我目前仍然坚持我的一个程序。我必须使用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
}
答案 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
的尺寸感兴趣,您无法直接将string
与int
进行比较。 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
答案 3 :(得分:0)
您的代码存在的问题是i
即使在remove()
调用后也会前进到下一个值,这意味着您的代码会跳过某些项目。
以下是正在发生的事情:假设您要删除此列表中的所有数字4及以上:{9 5 7 4 3}
。当i
为零时,您的算法会找到9
并将其删除。现在i
为1
,但您的列表为{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++;
}
}