我正在尝试读取一个文本文件,然后将其放入ArrayList中,然后遍历该ArrayList并将“this”一词替换为“ * *”。然后我想把这个修改过的ArrayList放回到一个带有新编辑文本的新文件中。
应用程序当前正确地将行读入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());
}
}
}
答案 0 :(得分: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);
}
答案 1 :(得分: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.]
您可以将行拆分为单词,并在Collections.replaceAll
字词上尝试List
。
或者,您可以使用String
's replace
method,它将与该行中的字匹配:
for (int i = 0; i < lines.size(); i++)
{
lines.set(i, lines.get(i).replace("this", "****"));
}
答案 2 :(得分:0)
来自replaceAll方法javadoc:
用列表替换列表中所有出现的指定值 另一个。更正式地,将newVal替换为列表中的每个元素e 这样(oldVal == null?e == null:oldVal.equals(e))。 (这种方法 对列表的大小没有影响。)
这意味着,您正在尝试使用保存"this"
文本的String实例替换保留"****"
文本的String实例,而不是替换String对象中的文本。请注意,String是不可变的。
您必须使用String#replace
或String#replaceAll
方法迭代字符串列表并替换文本。