我有一个按字母顺序排序的文本文件,大约有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,我们将它添加到数组列表。
然后将我看不出这有什么问题。 如果找到副本,那么循环肯定会破坏吗?
提前抱歉,结果证明是愚蠢的事。
答案 0 :(得分:4)
答案 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
循环会强制您的文件读取停止,这可能与您的意图有关,也可能不同。