【问题标题】:Removing duplicate lines from a text file从文本文件中删除重复的行
【发布时间】:2018-01-31 02:03:12
【问题描述】:

我有一个按字母顺序排序的文本文件,有大约 94,000 行名称(每行一个名称,只有文本,没有标点符号。

例子:

爱丽丝

鲍勃

西蒙

西蒙

汤姆

每一行都采用相同的形式,首字母大写,没有重音字母。

我的代码:

try{
        BufferedReader br = new BufferedReader(new FileReader("orderedNames.txt"));
        PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter("sortedNoDuplicateNames.txt", true)));

        ArrayList<String> textToTransfer = new ArrayList();


        String previousLine = "";
        String current = "";

        //Load first line into previous line
        previousLine = br.readLine();

        //Add first line to the transfer list
        textToTransfer.add(previousLine);


        while((current = br.readLine()) != previousLine && current != null){

            textToTransfer.add(current);
            previousLine = current;
        }
        int index = 0;
        for(int i=0; i<textToTransfer.size(); i++){
            out.println(textToTransfer.get(i));
            System.out.println(textToTransfer.get(i));
            index ++;

        }
        System.out.println(index);

}catch(Exception e){
    e.printStackTrace();
}

据我了解,正在读取文件的第一行并将其加载到 previousLine 变量中,就像我想要的那样,当前被设置为我们正在读取的文件的第二行,然后比较当前对上一行和null,如果和最后一行不一样并且不为null,我们将它添加到array-list中。

previousLine 然后设置为 currents 值,以便 current 的下一个 readLine 可以替换当前的“current”值以继续在 while 循环中进行比较。

我看不出这有什么问题。 如果找到重复项,循环肯定会中断吗?

如果发现是愚蠢的事情,请提前道歉。

【问题讨论】:

  • !(current = br.readLine()).equals(previousLine)
  • List 听起来不像是解决这个问题的正确数据结构。我认为您想使用 Set 的某些实现,因为它们不会像 List 那样存储重复项。最好考虑一下您对数据结构的选择,而不是随意决定ArrayList 是最好的。 Check out this SO question for details

标签: java text data-manipulation


【解决方案1】:

使用 TreeSet 而不是 ArrayList。

Set<String> textToTransfer = new TreeSet<>();

TreeSet 已排序,不允许重复。

【讨论】:

    【解决方案2】:

    不要重新发明轮子!

    如果您不想重复,您应该考虑使用不允许重复的Collection。删除重复元素的最简单方法是将内容添加到不允许重复的Set

    import java.util.*;
    import java.util.stream.*;
    
    public class RemoveDups {
        public static void main(String[] args) {
            Set<String> dist = Arrays.asList(args).stream().collect(Collectors.toSet()); 
        }
    }
    

    另一种方法是在 Java 代码读取文件之前从文本文件中删除重复项,例如在 Linux 中(比在 Java 代码中快得多):

    sort myFileWithDuplicates.txt | uniq -u > myFileWithoutDuplicates.txt
    

    【讨论】:

      【解决方案3】:

      虽然和其他人一样,我建议使用不允许重复进入集合的集合对象,但我想我可以为您确定您的函数出了什么问题。您尝试在 While 循环中比较字符串的方法(当然,这是您尝试做的)在 Java 中是不正确的。 ==(及其对应项)用于确定两个对象是否相同,这与确定它们的值是否相同是不同的。幸运的是,Java 的String 类在equals() 中有一个静态字符串比较方法。你可能想要这样的东西:

      while(!(current = br.readLine()).equals(previousLine) &amp;&amp; current != null){

      请记住,在此处中断您的 While 循环将强制您的文件读取停止,这可能是也可能不是您想要的。

      【讨论】:

        猜你喜欢
        • 2010-11-17
        • 1970-01-01
        • 1970-01-01
        • 2017-03-12
        • 1970-01-01
        • 2013-03-27
        • 2021-10-26
        • 2011-09-17
        相关资源
        最近更新 更多