从文本文件中删除重复的行

时间:2017-08-22 17:14:15

标签: java text data-manipulation

我有一个按字母顺序排序的文本文件,大约有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,我们将它添加到数组列表。

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

我看不出这有什么问题。 如果找到副本,那么循环肯定会破坏吗?

提前抱歉,结果证明是愚蠢的事。

3 个答案:

答案 0 :(得分:4)

使用TreeSet而不是ArrayList。

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

TreeSet已排序,不允许重复。

答案 1 :(得分: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

答案 2 :(得分:2)

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

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

请注意,在此处断开While循环会强制您的文件读取停止,这可能与您的意图有关,也可能不同。