该程序的目的是从文本文件中删除某些运动队及其成员,然后用新的一组值覆盖原始文件。通过将值读入一个数组,然后遍历该数组并删除组名和接下来的两行来尝试此操作,但是由于某种原因,它停止在索引之后遍历该数组。
我被困住了,所以任何帮助都会很棒
码:
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
你应该 从来不 remove
从List
时迭代。你在做什么
考虑一个简单的例子,我有一个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命名约定。变量应始终位于中camelCase
。PascalCase
为课程保留。
更新
可能会更容易,因此请使用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行整数,首先是学分的数量,然后是空格,然后是等级。我只需要记录成绩,而不是学