2015-02-24 2 views
1

У меня есть текстовый файл. Я хотел бы сделать набор из 4 строк и проверить, являются ли эти 4 строки уникальными. Если они уникальны, скопируйте их в другой текстовый файл.Удаление дубликатов из файла

file.txt содержит:

abc 
12:12:11 
john 
12/25/2014 
abc 
12:12:11 
doe 
12/25/2014 
abc 
12:12:11 
john 
12/25/2014 

Новый текстовый файл должен показывать только.

abc 
12:12:11 
john 
12/25/2014 
abc 
12:12:11 
doe 
12/25/2014 

and delete 
abc 
12:12:11 
john 
12/25/2014 

Есть ли способ сделать это на Java? Я не могу понять, как использовать LinkedHashSet для получения результата.

+0

Это наборы двух линий у вас здесь. Гарантировано ли, что у вас всегда есть четное количество строк в файле? – fge

+0

Также, какая версия Java? – fge

+0

Да. Общее число строк в a всегда будет четным. 1.6 версия java –

ответ

1

Поскольку у вас действительно есть наборы двух строк, а не один, дело немного сложнее, чем просто читать строки по одному и только дублировать дубликаты.

Вот решение с использованием Java 7:

public static void eliminateDups(final String srcfile, final String dstfile) 
    throws IOException 
{ 
    final StringBuilder sb = new StringBuilder(); 
    final Set<String> seen = new HashSet<>(); 
    final Charset charset = StandardCharsets.UTF_8; 

    final Path src = Paths.get(srcfile); 
    final Path dst = Paths.get(dstfile); 

    try (
     final BufferedReader reader = Files.newBufferedReader(src, charset); 
     final BufferedWriter writer = Files.newBufferedWriter(dst, charset, 
      StandardOpenOption.TRUNCATE_EXISTING); 
    ) { 
     String line1, line2; 
     while ((line1 = reader.readLine()) != null) { 
      line2 = reader.readLine(); 
      sb.setLength(0); 
      if (!seen.add(sb.append(line1).append(line2).toString())) 
       continue; 
      writer.write(line1); 
      writer.newLine(); 
      writer.write(line2); 
      writer.newLine(); 
     } 
    } 
} 

Для Java 6, я предлагаю вам использовать гуавы и его Closer управлять своими ресурсами ввода/вывода.

+0

Позвольте мне попробовать это решение. –

+0

Ну, если вы используете Java 6, это не сработает ... Можете ли вы использовать Guava? – fge

-1

Просто поместите каждую строку в набор, а затем напишите содержимое набора в файл. (Да LinkedHashSet implemetnation сохранить порядок)

+0

Ввод его в набор может изменить порядок линий. – CKing

+0

Он уже знает, использовать LinkedHashSet, чтобы не менять порядок. – Zielu

+1

Если он уже знает, что он должен использовать LinkedHashSet, в чем смысл вашего ответа? – CKing

0

Зависит от того, будет ли дата всегда гарантированно будет то же самое:

  • если да, то добавьте все строки в LinkedHashSet как составного значения,
  • , если нет, то, вероятно, используйте Map для сопоставления со значениями на сегодняшний день.
Смежные вопросы