Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/185.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 迭代器不循环_Java_Android_Loops_Iterator - Fatal编程技术网

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()很容易