不从文本文件

时间:2017-08-30 18:37:13

标签: java

我一直在尝试创建一个方法来搜索文本文件,找到我要删除的数据,删除数据之前的三行,数据和数据之后的三行。我正在使用的代码:

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

4 个答案:

答案 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

希望有所帮助