2015-02-24 105 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從值映射到日期。