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]