【发布时间】:2018-04-16 19:55:26
【问题描述】:
所以我很快就想回答一个关于代码战的问题。代码挑战的目的是剥离一个字符串,从代码中删除所有 cmets。
所以我有这段代码,它会进行剥离并给出我期望的结果:
public static String stripComments(String text, String[] commentSymbols) {
boolean ignoreNext = false;
StringBuilder noCommentString = new StringBuilder();
StringBuilder currentLine = new StringBuilder();
for (int i = 0; i < text.length(); i++) {
char c = text.charAt(i);
if (String.valueOf(c).equals("\n")) {
currentLine.append("\\n");
ignoreNext = false;
noCommentString.append(currentLine.toString().trim());
currentLine = new StringBuilder();
continue;
}
if (!ignoreNext) {
for (int j = 0; j < commentSymbols.length; j++) {
if (commentSymbols[j].equals(String.valueOf(c))) {
ignoreNext = true;
noCommentString.append(currentLine.toString().trim());
currentLine = new StringBuilder();
}
}
if (!ignoreNext) {
currentLine.append(c);
}
}
}
return noCommentString.toString();
}
但是由于一些相当奇怪的原因,这个测试失败了:
@Test
public void stripComments() throws Exception {
String expected = "apples, pears\ngrapes\nbananas";
String actual = StripComments.stripComments("apples, pears # and bananas\ngrapes\nbananas !apples", new String[]{"#", "!"});
assertEquals(expected, actual);
}
如果我要评估代码,实际的字符串是:
apples, pears\ngrapes\nbananas
当然你可以看到预期的字符串是:
apples, pears\ngrapes\nbananas
到底为什么会失败,我敢肯定这与一些奇怪的\n行为有关
【问题讨论】:
-
currentLine.append("\\n");听起来很阴暗。为什么要用文字\n替换合法的换行符(这是输出所期望的)? -
既然如此,为什么不直接在换行符处拆分并对结果列表进行操作?
-
糖,我把它留在里面的原因是想弄糟结果
-
有一个字符串列表@MadPhysicist
标签: java newline stringbuilder