我一直在尝试创建一个方法来搜索文本文件,找到我要删除的数据,删除数据之前的三行,数据和数据之后的三行。我正在使用的代码:
import java.io.IOException;
import java.io.FileWriter;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.Scanner;
public class DeleteData {
public static void main(String[] args) throws FileNotFoundException
{
//ArrayList<String> list = new ArrayList<String>();
String configurationString ="20\r\n" +
"21\r\n" +
"22\r\n" +
"23\r\n" +
"24";
deleteFromFile(configurationString);
}
public static void writeToFile(ArrayList<String> list)
{
try
{
BufferedWriter writer = new BufferedWriter(new FileWriter("write.txt"));
for(String x:list)
{
writer.write(x);
writer.newLine();
}
writer.close();
}
catch(IOException e)
{
e.getStackTrace();
}
}
public static void deleteFromFile(String search) throws FileNotFoundException
{
File inputFile = new File("write.txt");
Scanner scanner=new Scanner(inputFile);
ArrayList<String> list = new ArrayList<String>();
while(scanner.hasNextLine())
{
list.add(scanner.nextLine());
}
System.out.println(list.toString());
String textStr[] = search.split("\\r\\n|\\n|\\r");
for(int i=0; i<list.size();i++)
{
if(i < list.size()-3 && list.get(i+3).equals(textStr[3]))
{
list.remove(i);
list.remove(i+1);
list.remove(i+2);
list.remove(i+3);
list.remove(i+4);
list.remove(i+5);
list.remove(i+6);
writeToFile(list);
i+=7;
}
}
System.out.println(list.toString());
}
}
运行程序前的文件write.txt:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
我在运行它之后得到了这个:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 21 23 25 27 29 31 33 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
而不是
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
答案 0 :(得分:1)
每次执行list.remove(i)
时,列表实际都会折叠,下一行会成为i
索引的行:
:
i line
10 10
11 11
12 12
后:
i line
10 11
11 12
12 13
这就是为什么你丢弃交错的行;您应该拨打remove(i)
7次(但不要i
正确检查list.size()
!),或者撤销订单。
我仍然看到代码的更大问题。首先,不清楚为什么你有五行设置为searchTerm
,但只检查输入与单一 - 第四 - 一个list.get(i+3).equals(textStr[3])
表达式。其次,不清楚为什么你甚至需要首先将源文件的所有行放在list
中:
while(scanner.hasNextLine())
{
list.add(scanner.nextLine());
}
...在添加之前可以检查条件。
答案 1 :(得分:1)
删除转移索引后的所有元素:
删除此列表中指定位置的元素(可选操作)。将任何后续元素向左移位(从索引中减去一个)。返回从列表中删除的元素。
要实现您想要的效果,请先按最高索引删除元素:
list.remove(i+6);
list.remove(i+5);
list.remove(i+4);
list.remove(i+3);
list.remove(i+2);
list.remove(i+1);
list.remove(i);
然后程序的输出是:
[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23, 24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48, 49,50]
[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,27,28,29,30, 31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50]
答案 2 :(得分:0)
当您调用list.remove时,您实际上正在修改列表的大小,因为Java将调整列表的大小并将未来的元素向下移动。因此,当您在list.remove(i+1)
之后致电list.remove(i)
时,您实际上在前一次通话后删除了两个空格元素。
您应该做的是从list.remove(i+6)
开始,然后向后移动,直至到达list.remove(i)
。这保留了正确的指数。
答案 3 :(得分:0)
这种情况正在发生,因为每次执行list.remove(i)
时,剩余的元素都会向左移动,而下一个list.remove(i+1)
将删除您期望的元素之后的元素。您可以查看此link
希望有所帮助