【问题标题】:Java Reading in text file and outputting it to new file with removed duplicatesJava读取文本文件并将其输出到删除重复项的新文件
【发布时间】:2017-02-26 23:17:30
【问题描述】:

我有一个文本文件,每行都有一个整数,从小到大排序,我想将它们放入一个新的文本文件中,删除所有重复的数字。

我已设法读取文本文件并在屏幕上打印数字,但我不确定如何将它们实际写入新文件并删除重复项?

public static void main(String[] args)
{

    try
    {
        FileReader fr = new FileReader("sample.txt");
        BufferedReader br = new BufferedReader(fr);

        String str;
        while ((str = br.readLine()) != null) {
            out.println(str + "\n");
        }

        br.close();
    } 
    catch (IOException e) {
        out.println("File not found");
    }
}

【问题讨论】:

  • 您可能需要使用某种Set,检查该集合是否不包含您已读取的值,如果不包含,则将其添加到设置并将值写入新文件,如果是,您只需丢弃该值并继续
  • 假设输入是有序的,比较每两个连续读取的数字就足够了。因此,您可以很好地过滤重复项。可以通过FileWriter 写入文件。

标签: java bufferedreader parseint


【解决方案1】:

读取文件时,您可以将数字添加到Set,这是一种不允许重复值的数据结构(更多详细信息,请参见 Google 的“java 集合”)

然后您遍历此 Set,将数字写入 FileOutputStream(谷歌搜索“java io”以获取更多详细信息)

【讨论】:

  • 有没有办法在不设置的情况下过滤重复项?我们还没有在我的课堂上学到这一点。
  • @MC_Gilde 只要您可以断言输入已排序(您在问题中所述),您就可以做到这一点:只需比较每两个连续读取的数字。
  • @MC_Glide 你学过数组吗?您可以有一个数组,其中位置 N 指示数字 N 是否已被读取。假设您知道文件中的最大可能数量。或者,如果文件已排序(数字已排序),您只需阅读并与前一个文件进行比较。
  • @MC_Glide 对不起,我刚才看到数字是有序的。在这种情况下,如前所述,您只需将数字与前一个数字进行比较(如果相同,则为重复)
【解决方案2】:

不要打印每个数字,而是将它们添加到Array。添加完所有整数后,您可以循环遍历数组以删除重复项(可以很容易地找到此示例代码)。

一旦你有了一个数组,使用BufferedWriter 写入一个输出文件。如何做到这一点的示例代码可以在这里找到:https://www.mkyong.com/java/how-to-write-to-file-in-java-bufferedwriter-example/

或者,使用SetBufferedWriter 应该仍然以相同的方式工作。

【讨论】:

  • 您应该包含您自己的示例代码。做什么的描述似乎很合理,但通过示例实现更好地理解。如果您搜索解决方案,请在您的答案中包含相关部分作为引用,因为其他资源往往会消失。
【解决方案3】:

假设输入文件已经排序:

public class Question42475459 {

    public static void main(final String[] args) throws IOException {
        final String inFile = "sample.txt";
        try (final Scanner scanner = new Scanner(new BufferedInputStream(new FileInputStream("")), "UTF-8");
                BufferedWriter writer = new BufferedWriter(new FileWriter(inFile + ".out", false))) {

            String lastLine = null;
            while (scanner.hasNext()) {
                final String line = scanner.next();
                if (!line.equals(lastLine)) {
                    writer.write(line);
                    writer.newLine();
                    lastLine = line;
                }
            }
        }
    }

}

【讨论】:

    猜你喜欢
    • 2013-03-23
    • 1970-01-01
    • 1970-01-01
    • 2017-03-29
    • 1970-01-01
    • 2013-05-28
    • 2017-10-03
    • 1970-01-01
    • 2011-05-12
    相关资源
    最近更新 更多