Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.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_File_Java.util.scanner - Fatal编程技术网

Java 从文件中读取和删除某些行时出现问题?

Java 从文件中读取和删除某些行时出现问题?,java,file,java.util.scanner,Java,File,Java.util.scanner,该程序的目的是从文本文件中删除某些运动队及其成员,然后用新的值集覆盖原始文件。通过将值读入数组,然后在数组中循环,并删除团队名称和接下来的两行来尝试此操作,但由于某种原因,它会在索引之后停止在数组中循环 我被困住了,所以任何帮助都会很好 代码: 在迭代时,您应该从不从列表中删除。你正在做的事 考虑一个简单的例子,我有一个列表{1,2,3,4,5}。假设它的索引为0,我想删除所有大于3的数字 0-列表项为1,保留 1-列表项为2,保留 2-列表项为3,请删除。所有元素都被移位,列表现在是{1,2,

该程序的目的是从文本文件中删除某些运动队及其成员,然后用新的值集覆盖原始文件。通过将值读入数组,然后在数组中循环,并删除团队名称和接下来的两行来尝试此操作,但由于某种原因,它会在索引之后停止在数组中循环

我被困住了,所以任何帮助都会很好

代码:


在迭代时,您应该从不
列表中删除
。你正在做的事

考虑一个简单的例子,我有一个列表
{1,2,3,4,5}
。假设它的索引为0,我想删除所有大于3的数字

0-列表项为
1
,保留
1-列表项为
2
,保留
2-列表项为
3
,请删除。所有元素都被移位,列表现在是
{1,2,4,5}

3-列表项为
5
,删除
4-列表项是oops,不再有4

因此,我已经超出了
列表的末尾
,因为我在开始迭代时将大小设置为
5
,但在我删除索引
2
处的元素后,它变成了
4
,在删除索引
3
处的元素时,它变成了
3

你可能会说,“啊哈,我可以用
while
循环来解决这个问题”:

正确地说,您将获得一个
ConcurrentModificationException
。这只是使用增强的foreach循环而不是按索引循环的众多原因之一

要执行所需操作,请使用
迭代器

final Iterator<String> iter = teams.iterator();
while(iter.hasNext()) {
    if(iter.next().equals(testString))
        iter.remove();
}
反向删除项目非常重要。这是由于与上面相同的问题造成的,如果删除索引处的项目(例如)
10
,则索引
11
处的项目将下移。因此,当您在索引
11
处删除该项时,实际上您正在删除该项最初是什么索引
12

你可以用卑鄙的伎俩

for(int i = 0; i < 2; ++i)
    teams.remove(idx) 
for(int i=0;i<2;++i)
团队。删除(idx)

也就是说,继续删除找到的索引中的项目,因为列表将向下移动以填补空白,您将实际删除所需的项目和上面的两个项目。我认为这使得代码很难阅读。您可能会忘记这一技巧,然后回到代码中,必须了解它在做什么。

在迭代时,您应该永远不要从
列表中删除
。你正在做的事

考虑一个简单的例子,我有一个列表
{1,2,3,4,5}
。假设它的索引为0,我想删除所有大于3的数字

0-列表项为
1
,保留
1-列表项为
2
,保留
2-列表项为
3
,请删除。所有元素都被移位,列表现在是
{1,2,4,5}

3-列表项为
5
,删除
4-列表项是oops,不再有4

因此,我已经超出了
列表的末尾
,因为我在开始迭代时将大小设置为
5
,但在我删除索引
2
处的元素后,它变成了
4
,在删除索引
3
处的元素时,它变成了
3

你可能会说,“啊哈,我可以用
while
循环来解决这个问题”:

正确地说,您将获得一个
ConcurrentModificationException
。这只是使用增强的foreach循环而不是按索引循环的众多原因之一

要执行所需操作,请使用
迭代器

final Iterator<String> iter = teams.iterator();
while(iter.hasNext()) {
    if(iter.next().equals(testString))
        iter.remove();
}
反向删除项目非常重要。这是由于与上面相同的问题造成的,如果删除索引处的项目(例如)
10
,则索引
11
处的项目将下移。因此,当您在索引
11
处删除该项时,实际上您正在删除该项最初是什么索引
12

你可以用卑鄙的伎俩

for(int i = 0; i < 2; ++i)
    teams.remove(idx) 
for(int i=0;i<2;++i)
团队。删除(idx)

也就是说,继续删除找到的索引中的项目,因为列表将向下移动以填补空白,您将实际删除所需的项目和上面的两个项目。我认为这使得代码很难阅读。您可能会忘记这个技巧,然后回到代码中,必须弄清楚它在做什么。

现在,我使用两个列表。一个是原件,另一个是删除列表。我阅读了原始列表,如果条目以“团队”开头(如果您有其他逻辑来区分团队名称和成员名称,请添加),我会将其添加到删除列表以及以下条目中,直到找到下一个要保留的团队名称。最后,我从原始列表中删除所有删除条目

public class ListRemovalDemo 
{
    public static void main(String[] args) 
    {
            List<String> teamList = new ArrayList<String>();
            teamList.add("TeamName1");
            teamList.add("Member1Team1");
            teamList.add("Member2Team1");
            teamList.add("TeamName2");
            teamList.add("Member1Team2");
            teamList.add("Member2Team2");
            teamList.add("TeamName3");
            teamList.add("Member1Team3");
            teamList.add("Member2Team3");
            List<String> removalList = new ArrayList<String>();
            String teamToRemove = "TeamName2";
            Iterator<String> teamListIterator = teamList.listIterator();
            String entry;
            while(teamListIterator.hasNext())
            {
                entry = teamListIterator.next();
                if(entry.equals(teamToRemove))
                {
                    removalList.add(entry);  
                    if(teamListIterator.hasNext())
                    {
                        entry = teamListIterator.next();
                            while(!entry.startsWith("Team"))
                            {
                                removalList.add(entry);
                                if(teamListIterator.hasNext())
                                    entry = teamListIterator.next();
                                else
                                    break;
                            }
                    }
                }
            }
            teamList.removeAll(removalList);
            System.out.println("After removal of " + teamToRemove + ":\n" + teamList);
    }
}

现在,我使用两个列表。一个是原件,另一个是删除列表。我阅读了原始列表,如果条目以“团队”开头(如果您有其他逻辑来区分团队名称和成员名称,请添加),我会将其添加到删除列表以及以下条目中,直到找到下一个要保留的团队名称。最后,我从原始列表中删除所有删除条目

public class ListRemovalDemo 
{
    public static void main(String[] args) 
    {
            List<String> teamList = new ArrayList<String>();
            teamList.add("TeamName1");
            teamList.add("Member1Team1");
            teamList.add("Member2Team1");
            teamList.add("TeamName2");
            teamList.add("Member1Team2");
            teamList.add("Member2Team2");
            teamList.add("TeamName3");
            teamList.add("Member1Team3");
            teamList.add("Member2Team3");
            List<String> removalList = new ArrayList<String>();
            String teamToRemove = "TeamName2";
            Iterator<String> teamListIterator = teamList.listIterator();
            String entry;
            while(teamListIterator.hasNext())
            {
                entry = teamListIterator.next();
                if(entry.equals(teamToRemove))
                {
                    removalList.add(entry);  
                    if(teamListIterator.hasNext())
                    {
                        entry = teamListIterator.next();
                            while(!entry.startsWith("Team"))
                            {
                                removalList.add(entry);
                                if(teamListIterator.hasNext())
                                    entry = teamListIterator.next();
                                else
                                    break;
                            }
                    }
                }
            }
            teamList.removeAll(removalList);
            System.out.println("After removal of " + teamToRemove + ":\n" + teamList);
    }
}
请始终使用Java命名约定。变量应始终在
camelCase
PascalCase
是为类保留的。这个代码很难辨认,我必须集中精力,甚至弄清楚什么是
,什么是变量。请适当地编辑您的代码。请始终使用Java命名约定。变量应始终在
camelCase
PascalCase
是为类保留的。这个代码很难辨认,我必须集中精力,甚至弄清楚什么是
,什么是变量。请适当地编辑您的代码。并格式化,我还没用过
for(int i = 0; i < 2; ++i)
    teams.remove(idx) 
public class ListRemovalDemo 
{
    public static void main(String[] args) 
    {
            List<String> teamList = new ArrayList<String>();
            teamList.add("TeamName1");
            teamList.add("Member1Team1");
            teamList.add("Member2Team1");
            teamList.add("TeamName2");
            teamList.add("Member1Team2");
            teamList.add("Member2Team2");
            teamList.add("TeamName3");
            teamList.add("Member1Team3");
            teamList.add("Member2Team3");
            List<String> removalList = new ArrayList<String>();
            String teamToRemove = "TeamName2";
            Iterator<String> teamListIterator = teamList.listIterator();
            String entry;
            while(teamListIterator.hasNext())
            {
                entry = teamListIterator.next();
                if(entry.equals(teamToRemove))
                {
                    removalList.add(entry);  
                    if(teamListIterator.hasNext())
                    {
                        entry = teamListIterator.next();
                            while(!entry.startsWith("Team"))
                            {
                                removalList.add(entry);
                                if(teamListIterator.hasNext())
                                    entry = teamListIterator.next();
                                else
                                    break;
                            }
                    }
                }
            }
            teamList.removeAll(removalList);
            System.out.println("After removal of " + teamToRemove + ":\n" + teamList);
    }
}
After removal of TeamName2:
[TeamName1, Member1Team1, Member2Team1, TeamName3, Member1Team3, Member2Team3]