2015-02-24 104 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 

新的TXT文件应仅显示。

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 2015-02-24 16:36:52

+0

另外,哪个Java版本是? – fge 2015-02-24 16:38:02

+0

是的。 a中的总行数将始终为偶数。 1.6 java版 – 2015-02-24 16:41:33

回答

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来管理您的I/O资源。

+0

让我试试这个解决方案。 – 2015-02-24 16:54:36

+0

那么,如果你使用Java 6,它将无法工作......你可以使用番石榴? – fge 2015-02-24 16:55:05

-1

只需将每行放入Set中,然后将该集的内容写入文件。 (是的LinkedHashSet implemetnation保存顺序)

+0

将它放入一个Set可能会改变线条的顺序。 – CKing 2015-02-24 16:41:47

+0

他已经知道要使用LinkedHashSet,所以不要更改顺序。 – Zielu 2015-02-24 16:44:44

+1

如果他已经知道他必须使用LinkedHashSet,那么你的答案是什么? – CKing 2015-02-25 04:15:02

0

取决于日期是否始终保证是相同的:

  • 如果是,再加入所有的线到LinkedHashSet作为一个复合值,
  • 如果不是,那么可能使用Map从值映射到日期。