Java 迭代器不循环
在我的项目中,用户输入随机字母。然后我遍历Java 迭代器不循环,java,android,loops,iterator,Java,Android,Loops,Iterator,在我的项目中,用户输入随机字母。然后我遍历myu列表,查看这些随机字母是否出现在myu列表中。如果是这样,我会将它们从我的列表中删除 例如: 列出我的列表包含:[a、b、c、d] List rand包含:[r,a] 目标:a将从my\u列表中删除 问题:迭代器在my_列表中循环搜索字母r。字母r不在myu列表中。但不是继续下一个字母a,而是迭代器退出循环,a仍保留在my_列表中 有人能告诉我为什么我的循环在第一个字母之后一直断开吗 这是我的密码: public void removeLetter
myu列表
,查看这些随机字母是否出现在myu列表
中。如果是这样,我会将它们从我的列表中删除
例如:
列出我的列表
包含:[a、b、c、d]
List rand
包含:[r,a]
目标:a
将从my\u列表中删除
问题:迭代器
在my_列表
中循环搜索字母r
。字母r
不在myu列表中。但不是继续下一个字母a
,而是迭代器退出循环,a
仍保留在my_列表中
有人能告诉我为什么我的循环在第一个字母之后一直断开吗
这是我的密码:
public void removeLetters( List<String> my_list, List<String> rand ) {
Iterator<String> i = my_list.iterator();
for( String s : rand ) {
while( i.hasNext() ) {
Object o = i.next();
if( o.toString().equals( s ) ) {
i.remove();
i = my_list.iterator();
break;
}
}
}
}
public void removeLetters(列出我的列表,列出兰德){
迭代器i=my_list.Iterator();
for(字符串s:rand){
while(i.hasNext()){
对象o=i.next();
如果(o.toString()等于){
i、 删除();
i=my_list.iterator();
打破
}
}
}
}
我希望我把我的问题解释得足够好。如果我需要更详细的解释,请告诉我
谢谢尝试在for循环中创建迭代器
for(String s : rand) {
Iterator<String> i = my_list.iterator();
while(i.hasNext()) {
...
}
}
for(字符串s:rand){
迭代器i=my_list.Iterator();
while(i.hasNext()){
...
}
}
尝试在for循环内创建迭代器
for(String s : rand) {
Iterator<String> i = my_list.iterator();
while(i.hasNext()) {
...
}
}
for(字符串s:rand){
迭代器i=my_list.Iterator();
while(i.hasNext()){
...
}
}
这是你的问题。正如你所解释的,你必须把它从我的清单上删除
所以使用
my_list.remove();
这是你的问题。正如你所解释的,你必须把它从我的清单上删除
所以使用
my_list.remove();
或者,只需使用一个衬里:
my_list.removeAll(rand);
您还可以使用列表的功能按相等方式删除对象:
for(String s: rand) {
my_list.remove(s);
}
如果确实要迭代,这正是java.util.AbstractCollection所做的:
Iterator<String> it = my_list.iterator();
while (it.hasNext()) {
if (rand.contains(it.next())) {
it.remove();
}
}
Iterator it=my_list.Iterator();
while(it.hasNext()){
if(rand.contains(it.next())){
it.remove();
}
}
或者,只需使用一行:
my_list.removeAll(rand);
您还可以使用列表的功能按相等方式删除对象:
for(String s: rand) {
my_list.remove(s);
}
如果确实要迭代,这正是java.util.AbstractCollection所做的:
Iterator<String> it = my_list.iterator();
while (it.hasNext()) {
if (rand.contains(it.next())) {
it.remove();
}
}
Iterator it=my_list.Iterator();
while(it.hasNext()){
if(rand.contains(it.next())){
it.remove();
}
}
问题在于,在内部循环中,您通过外部循环的第一次迭代到达i迭代器的末尾。然后,当for的第二次迭代开始时,迭代器i hasNext方法总是返回false,并且似乎什么也没做,就像您所说的
您应该为for的每个新的s重新初始化i迭代器。问题是,在内部循环中,您通过外部循环的第一次迭代到达i迭代器的末尾。然后,当for的第二次迭代开始时,迭代器i hasNext方法总是返回false,并且似乎什么也没做,就像您所说的
您应该为for的每个新s重新初始化i迭代器。在循环下一项之前,您需要将迭代器重置为其开头。在循环下一项之前,您需要将迭代器重置为其开头。您只能通过迭代器一次。想想看:一旦i.hasNext()
返回false
,您就会跳出内部循环,围绕外部循环,然后再次调用i.hasNext()
。为什么它现在开始返回true
?
一句话:每次重新启动外部循环时都必须创建一个新的迭代器(基本上是在循环内移动my_list.iterator()
call)
更好的方法是遍历列表一次,并在输入列表上使用contains()
:
for(Iterator it = my_list.iterator(); it.hasNext(); ) {
if(rand.contains(it.Next()) {
it.remove();
}
}
如果输入列表(rand)可能足够大,因此可能需要在循环之前将其转换为一个集合:rand=newhashset(rand)代码>这将使您的算法是线性的,而不是二次的。您只能通过一次迭代器。想想看:一旦i.hasNext()
返回false
,您就会跳出内部循环,围绕外部循环,然后再次调用i.hasNext()
。为什么它现在开始返回true
?
一句话:每次重新启动外部循环时都必须创建一个新的迭代器(基本上是在循环内移动my_list.iterator()
call)
更好的方法是遍历列表一次,并在输入列表上使用contains()
:
for(Iterator it = my_list.iterator(); it.hasNext(); ) {
if(rand.contains(it.Next()) {
it.remove();
}
}
如果输入列表(rand)可能足够大,因此可能需要在循环之前将其转换为一个集合:rand=newhashset(rand)代码>这将使您的算法是线性的,而不是二次的。您为什么不使用contains
public void removeLetters(List<String> my_list, List<String> rand)
{
List<String> updatedList = new ArrayList<String>();
for (String s : my_list)
{
if (!rand.contains(s))
{
updatedList.add(s);
}
}
}
public void removeLetters(列出我的列表,列出兰德)
{
List updatedList=新建ArrayList();
用于(字符串s:我的列表)
{
如果(!rand.包含)
{
更新列表。添加;
}
}
}
不使用contains有什么原因吗
public void removeLetters(List<String> my_list, List<String> rand)
{
List<String> updatedList = new ArrayList<String>();
for (String s : my_list)
{
if (!rand.contains(s))
{
updatedList.add(s);
}
}
}
public void removeLetters(列出我的列表,列出兰德)
{
List updatedList=新建ArrayList();
用于(字符串s:我的列表)
{
如果(!rand.包含)
{
更新列表。添加;
}
}
}
为什么不直接使用my_list.removeAll(兰德)代码>?为什么不直接使用my_list.removeAll(兰德)代码>?知道为什么这被否决了吗?我认为removeAll给了我一个bug,所以我必须更具体一点,遍历列表中的每一项。但是我可以再试一次。谁知道呢,斯塔克大街上有一些奇怪的人。我很想知道这个bug是什么。removeAll()很容易