Хм ... 40 мегабайт кажется достаточно маленьким, чтобы вы могли построить Set
из линий и затем распечатать их все обратно. Это было бы намного быстрее, чем работа O (n 2 ).
Было бы что-то вроде этого (игнорируя исключения):
public void stripDuplicatesFromFile(String filename) {
BufferedReader reader = new BufferedReader(new FileReader(filename));
Set<String> lines = new HashSet<String>(10000); // maybe should be bigger
String line;
while ((line = reader.readLine()) != null) {
lines.add(line);
}
reader.close();
BufferedWriter writer = new BufferedWriter(new FileWriter(filename));
for (String unique : lines) {
writer.write(unique);
writer.newLine();
}
writer.close();
}
Если порядок важен, вы можете использовать LinkedHashSet
вместо HashSet
. Поскольку элементы хранятся по ссылке, накладные расходы дополнительного связанного списка должны быть незначительными по сравнению с фактическим объемом данных.
Редактировать: Как отметил Алекс Семинар, если вы не возражаете против создания временного файла, вы можете просто распечатать строки по мере их чтения. Это позволяет вам использовать простой HashSet
вместо LinkedHashSet
. Но я сомневаюсь, что вы заметите разницу в операции ввода-вывода, подобной этой.