2016-02-29 19 views
0

我寫了一些代碼,這些代碼幾乎就我希望它的功能而言。這種Java代碼的邏輯如下:使用Java將獨特的行寫入文件

  1. 從指定位置讀取源文件
  2. 正如我們在閱讀每一行,應用正則表達式來獲取捕獲組的結果(在這種情況下, URL)所有這些行讀
  3. 後,把URL和行號到HashMap中
  4. 複製這些值轉換成一個列表,並責令其按行號增加
  5. 讀取源文件再次
  6. 對於每個行號m在列表中出動了,寫信給我們的新文件

這裏是代碼:

package preproc; 

import java.io.*; 
import java.util.*; 
import java.util.regex.*; 

public class Preproc { 

    public static void main(String[] args) { 

     File file = new File("C:\\Users\\AnthonyH\\Desktop\\file.txt"); 
     BufferedReader br; 

     HashMap<String, Integer> hmap = new HashMap<>(); 

     try { 

      br = new BufferedReader(new InputStreamReader(new FileInputStream(file))); 

      int linenumber = 0; 
      String event; 

      while ((event = br.readLine()) != null) { 

     //System.out.println("LINE=" + event); 
       Pattern regex = Pattern.compile("^.*url=(.*)"); 
       Matcher check = regex.matcher(event); 
       if (check.find()) { 
        String match = check.group(1); 
      //System.out.println("GROUP=" + match + " LINE=" + linenumber); 
        if (!hmap.containsKey(match)) { 
      //System.out.println("ADDING TO INDEX"); 
         hmap.put(match, linenumber); 
        } 
       } 

       linenumber++; 
      } 

      List<Integer> lineNumbers = new ArrayList<>(hmap.values()); 
     //System.out.println("SIZE=" + lineNumbers.size()); 
      Collections.sort(lineNumbers); 

      File file2 = new File("C:\\Users\\AnthonyH\\Desktop\\file2.txt"); 
      BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(file))); 
      BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file2))); 

      int currentLine = 0; 

      for (Integer line : lineNumbers) { 

     //System.out.println("LINE=" + line + "CURRENT LINE=" + currentLine); 
       while (currentLine < line) { 
        reader.readLine(); 
        currentLine++; 
       } 
       writer.write(reader.readLine()); 
     writer.newLine(); 
       currentLine++; 
      } 

     writer.close(); 

     } catch (IOException e) { 

      e.printStackTrace(); 

     } 

    } 

} 

我現在面臨的問題是,它是寫所有唯一字符串匹配到HashMap中,當我只想添加那些在原始文件中出現過的文件時。 I.E. site1.com的五個實例和site2.com的一個實例,地圖將具有site1.com的第一個實例和site2.com的唯一實例。我只想要site2.com。

非常感謝所有幫助。

回答

0

創建一個Map<String, Occurrence>其中Occurrence包含(第一個)行號以及URL的出現次數。當寫入時,忽略至少出現次數> 1的行。

這就是其中之一。

你可以有一個Set至少兩次遇到的網址。只要您找到已經在地圖中的網址,就可以將其添加到該集合中。編寫時,您會忽略集合中的URL。

請注意,如果文件不是太大,可以將行存儲在內存中,而不是重新讀取文件。

+0

你能給我一個這樣的例子嗎?我不熟悉將兩個值設置爲單個鍵值映射 –

+0

最終,這些將是非常大的文件,因此我現在將它保留在內存不足 –

+1

您不設置兩個值。只有一個。這個值是一個名爲Occurrence的類的實例,它有兩個字段:請閱讀https://docs.oracle.com/javase/tutorial/java/javaOO/並嘗試一些內容。在使用Maps和IO之前,您應該掌握類,abjects和字段的概念。 –

0
package preproc; 

import java.io.*; 
import java.util.*; 
import java.util.regex.*; 

public class Preproc { 

public static void main(String[] args) { 

    File file = new File("C:\\Users\\AnthonyH\\Desktop\\file.txt"); 
    BufferedReader br; 

    HashMap<String, List<Integer>> hmap = new LinkedHashMap<String, List<Integer>>(); 

    try { 

     br = new BufferedReader(new InputStreamReader(new FileInputStream(file))); 

     int linenumber = 0; 
     String event; 

     while ((event = br.readLine()) != null) { 

      Pattern regex = Pattern.compile("^.*url=(.*)"); 
      Matcher check = regex.matcher(event); 
      if (check.find()) { 
       String match = check.group(1); 

       List<Integer> lineNumbers = new ArrayList<Integer>(); 
       if (hmap.containsKey(match)) { 
        lineNumbers = hmap.get(match); 
       } 
       lineNumbers.add(linenumber); 

        hmap.put(match, lineNumbers); 
      } 

      linenumber++; 
     } 

     List<List<Integer>> lineNumbers = new ArrayList<List<Integer>>(hmap.values()); 

     File file2 = new File("C:\\Users\\AnthonyH\\Desktop\\file2.txt"); 

     BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file2))); 



     for (List<Integer> linesOccurences : lineNumbers) { 

      int currentLine = 0; 
      if(linesOccurences.size() == 1) 
      { 
       BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(file))); 
       int line = linesOccurences.get(1); 
       while (currentLine++ < line) { 
        reader.readLine(); 
       } 
       writer.write(reader.readLine()); 
       writer.newLine(); 
       reader.close(); 
      } 

     } 

    writer.close(); 

    } catch (IOException e) { 

     e.printStackTrace(); 

    } 

} 
} 

嘗試編輯此代碼。在前一箇中,BufferedReader對象不在正確的位置。

+0

我確實嘗試過,但它仍然給我一個非唯一行的實例 –

+0

剛剛看到了編輯。謝謝! –