2014-01-07 89 views
0

我想讀的文本文件,然後我放進一個ArrayList,然後再通過ArrayList和「本」與「字代替任何出現* *「。然後我想把這個修改後的ArrayList放回到新編輯的文本中。讀取文件,替換詞,並寫入到一個新文件中的Java

的應用目前讀線到ArrayList中正確寫入新文件的工作。然而,replaceWords方法不會出現預期即,這是不被* *代替將被運行。任何幫助將不勝感激!

package com.assignment2s162305.answers; 

import java.io.FileWriter; 
import java.io.IOException; 
import java.io.BufferedReader; 
import java.io.FileReader; 
import java.util.ArrayList; 
import java.util.List; 
import java.util.Collections; 

public class Question27 { 

    private List<String> lines = new ArrayList<String>(); 

    // read original file to an ArrayList 
    public String[] readOriginalFile(String filename) throws IOException { 
     FileReader fileReader = new FileReader(filename); 
     BufferedReader bufferedReader = new BufferedReader(fileReader); 
     String line = null; 
     while ((line = bufferedReader.readLine()) != null) { 
      lines.add(line); 
     } 
     bufferedReader.close(); 
     return lines.toArray(new String[lines.size()]); 
    } 

    // replace words with **** 
    public void replaceWords() { 
     Collections.replaceAll(lines, "this", "****"); 
     System.out.println(lines); 
    } 

    // write modified ArrayList to a new file 
    public void writeToNewFile() throws IOException { 
     FileWriter writer = new FileWriter("output.txt"); 
     for (String str : lines) { 
      writer.write(str); 
     } 
     writer.close(); 
    } 

} 

package com.assignment2s162305.answers; 

import java.io.IOException; 

public class Question27Test { 
    public static void main(String[] args) { 
     Question27 question27object = new Question27(); 

     String filename = "Hamlet2.txt"; 

     try { 
      String[] lines = question27object.readOriginalFile(filename); 
      System.out.println("______ORIGINAL DOCUMENT______\n"); 
      for (String line : lines) { 
       System.out.println(line); 
      } 
      System.out.println("\n\n"); 
      question27object.replaceWords(); 
      question27object.writeToNewFile(); 
     } catch(IOException e) { 
      // Print out the exception that occurred 
      System.out.println("Unable to create "+filename+": "+e.getMessage());     
     } 
    } 
} 

回答

1

您的replaceWords方法有一個錯誤。爲了解決這個問題,你需要循環線路並在每一行中進行替換。你已經實現的是用****替換所有等於"this"的行。所以這工作正常,但不是你想要的。

這此代碼。這將解決它。

public void replaceWords() { 
    ArrayList<String> lns = new ArrayList<String>(); 
    for (String ln : lines){ 
     lns.add(ln.replaceAll("this", "****")); 
    } 
    lines.clear(); 
    lines = lns; 
    System.out.println(lines); 
} 
+0

謝謝這個固定。現在我讀了你的修復程序,我可以看到我要去哪裏錯了。 – kyussmondo

0

您正在閱讀的文本行到你的陣列lines。但是,Collections.replaceAll不在字符串內部進行搜索來替換字"this";它只會測試整條線是否等於"this",這當然不是。

用另一個替換列表中一個指定值的所有出現。更正式地,用newVal替換列表中的每個元素e(oldVal == null?e == null:oldVal.equals(e))。

例子:

List<String> lines = new ArrayList<String>(); 
lines.add("This"); 
lines.add("this"); 
lines.add("THIS"); 
lines.add("this won't work."); 
Collections.replaceAll(lines, "this", "****"); 
System.out.println(lines); 

輸出:

[This, ****, THIS, this won't work.] 

您可以將行拆分爲詞,並在詞的List嘗試Collections.replaceAll

或者,你可以使用String's replace method,這將行內匹配的話:

for (int i = 0; i < lines.size(); i++) 
{ 
    lines.set(i, lines.get(i).replace("this", "****")); 
} 
0

從的replaceAll方法的javadoc:

替換一個指定值中出現的所有與 列表另一個。更正式地,以替代的newval列表中的每個 元素e(OLDVAL == NULLè== NULL:oldVal.equals(E))。 (此方法 對列表的大小沒有任何影響。)

這意味着,你正在試圖取代字符串例如由字符串實例保存"****"文本,而不是替換String對象中的文本持完全相同"this"文本。請注意,字符串是不可變的。

您必須迭代字符串列表並使用String#replaceString#replaceAll方法替換文本。

相關問題