我目前正在开展一个项目,该项目涉及使用Weka根据其犯罪类型对头条新闻进行分类。由于Weka使用.arff文件,因此必须转义任何包含撇号的标题。
List<String> headlines = demoPipe.getHeadlines();
for (int i = 0; i < headlines.size(); i++) {
if(headlines.get(i).contains("'"))
headlines.get(i).replace("'", "\\'");
System.out.println(headlines.get(i));
//System.out.printf("'%s'%n", headline);
}
if语句是我试图逃避撇号的地方,但是当我打印出标题时,任何带有撇号的标题都保持不变。我该如何解决这个问题?
答案 0 :(得分:3)
字符串是不可变的,这意味着对字符串的任何修改都会产生带有新修改的新字符串,并保留前一个字符串不变。
headlines.get(i).replace("'", "\\'");
上面的replace
操作返回一个带有新修改的新字符串对象,但你忽略了它。
因此,要解决此问题,您需要使用set
的{{1}}方法并分配新字符串。
List<T>
此外,您可以使用JDK-8中的headlines.set(i,headlines.get(i).replace("'", "\\'"));
方法简化替换逻辑:
replaceAll
如果由于某种原因,您不想修改源列表,那么您可以将结果收集到新列表中,如下所示:
headlines.replaceAll(s -> s.contains("'") ? s.replace("'", "\\'") : s);
或者您可以直接打印到控制台而无需构建新列表:
List<String> result =
headlines.stream()
.map(s -> s.contains("'") ? s.replace("'", "\\'") : s)
.collect(Collectors.toCollection(ArrayList::new));
答案 1 :(得分:0)
我认为它不会像你一样取而代之。几天前我遇到了同样的问题。你必须指定它才能使它有用。
List<String> headlines = demoPipe.getHeadlines();
for (int i = 0; i < headlines.size(); i++) {
if(headlines.get(i).contains("'"))
headlines.set(i,headlines.get(i).replace("'", "\'"));
System.out.println(headlines.get(i));
//System.out.printf("'%s'%n", headline);
}
尝试这样它会对你有用。