当前位置: 首页 > 面试题库 >

从文件读取和删除某些行时遇到问题?

景远航
2023-03-14
问题内容

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

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

码:

private void RemoveSportsTeamButtonActionPerformed(java.awt.event.ActionEvent evt) {

    String ChosenTeam = "";
    ChosenTeam = JOptionPane.showInputDialog("What Team Do you want to remove?");

    ArrayList<String> Teamlist = new ArrayList<String>();

    if (ChosenTeam.length() > 0) {
    } else {
        Scanner Reader = null;
        try {
            Reader = new Scanner(new File("ListofSportTeams.txt"));
        } catch (FileNotFoundException ex) {

        }

        while (Reader.hasNext()) {
            Teamlist.add(Reader.next());
        }
        Reader.close();

        for (int count = 0; count < Teamlist.size(); count++) {
            {
                if (Teamlist.get(count).equals(ChosenTeam)) {
                    Teamlist.remove(count);
                    Teamlist.remove(count + 1);
                    Teamlist.remove(count + 2);
                }
            }

        }
    }

}

SportTeamList.txt =

Team1
Jeff
James
Team2
Steve
Peter

问题答案:

你应该 从来不 removeList时迭代。你在做什么

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

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


所以,我有超调的结束List,因为我带的大小是5当我开始迭代却成了4之后我删除索引的元素2,并成为3当我在索引中删除的元素3

您可能会说:“啊哈,我可以通过while循环解决此问题”:

int i = 1;
while(i < teams.size()) {
    //do stuff
}

但这 更糟

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

因此,没有错误。看来问题已解决。但是列表包含什么?它包含{1,2,4}。但是 4
大于3
。由于索引移位,它被跳过了。您现在有了一个更加隐蔽的错误。

如果您正在使用适当的增强型foreach循环,例如:

for(final String team : teams) {
    //do stuff with team
}

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

为了做你想要的使用Iterator

final Iterator<String> iter = teams.iterator();
while(iter.hasNext()) {
    if(iter.next().equals(testString))
        iter.remove();
}

我将重申我的评论:

始终
使用Java命名约定。变量应始终位于中camelCasePascalCase为课程保留。

更新

可能会更容易,因此请使用indexOf方法在中找到团队名称List并删除所需的元素

public void remove(final List<String> teams, final String name) {
    final int idx = teams.indexOf(name);
    if(idx < 0) 
        throw new IllegalArgumentException("Team " + name + " not present in list.");
    for(int i = idx + 2; i >= idx; --i) 
        teams.remove(i);
}

反向 删除这些项目非常重要
。这是由于与上述相同的问题,例如,如果删除索引处10的项目,则位于索引处的项目11将向下移动。因此,当您去删除索引处的项目时11,实际上是在删除该项目,它最初是索引12

你可以用肮脏的把戏

for(int i = 0; i < 2; ++i)
    teams.remove(idx)

即继续在找到的索引处删除该项目,因为列表将向下随机排列以填补空白,您实际上将删除所需的项目以及位于其上方的两个项目。我认为这使代码很难阅读。您可能会忘记此技巧,然后返回代码,必须弄清楚它在做什么。



 类似资料:
  • 我知道这是非常基本的东西,但出于某种原因,我在使用bufferedReader/Writer时遇到了问题。我试图获取第一行文本并将其返回到另一个方法。然而,由于某些原因,写入程序似乎没有写入临时文件,也没有更改临时文件的名称。 通过抛出一些印刷声明,我已经能够弄清楚: > 私有静态字符串wavFinder()引发IOException{ 以下是我正在使用的方法。如果你注意到什么,请告诉我,如果你有

  • 本文向大家介绍使用批处理删除文件夹时遇到的问题,包括了使用批处理删除文件夹时遇到的问题的使用技巧和注意事项,需要的朋友参考一下 C盘有一个文件夹1,里面有2.exe和3.exe 。 想做一个批处理,先运行1.exe,安装完成后运行2.exe  等到2.exe安装完成后,删除文件夹1 我的代码如下 现在有一个缺点。2和3安装完成后,文件夹1不能被删除,里面2.exe被删除,3.exe仍然存在。不知道

  • 问题内容: 如果我有一些代码,例如 并且输入文件包含成对的行,我该如何做,以便仅导入每行的第一行?因此,换句话说,每条奇数行都只有?谢谢 问题答案: 您可能想考虑使用来简化奇数行()的过滤。或者在另一种方法中,如果您使用的是JDK7,则可以使用该方法,并在迭代时再次过滤奇数。

  • 问题内容: 我正在使用Linux,并打算使用Shell删除一些文件。 我的文件夹中有一些文件,一些文件名包含单词“ good”,其他文件名则没有。例如: 我要删除名称中不包含“ good”的文件,因此其余文件为: 如何在shell 中使用它?我尝试使用 但这不起作用。 非常感谢! 问题答案: 此命令应执行所需的操作: 它可能比其他命令运行得更快,因为它不涉及使用正则表达式(这很慢,对于这种简单的操

  • 我很难让JavaFX应用程序在IDE之外运行。我正在使用IntelliJ IDEA 2019.3,并使用OpenJDK-12进行编译。JavaFX sdk版本为11.0.2,我使用外部库JFoenix-9.0.8和JSerialComm-2.6.0。操作系统是Windows10,安装了JDK14,我可以运行使用命令行以相同方式构建的非JavaFX应用程序。当我尝试从命令行运行mu JavaFX.j

  • 我必须在一个文本文件中读取两组整数。一个是学生可以获得的学分数,然后下一个整数是考试成绩的字母。我可以将整数读入ArrayList中,但问题是,我希望首先读取它们的信用量,然后选择将它们添加到哪个ArrayList中,在一定的信用量下还是超过一定的信用量。我不想把学分加起来,只想把他们得到的分数加起来。我在文本文件中有25行整数,首先是学分的数量,然后是空格,然后是等级。我只需要记录成绩,而不是学