【发布时间】:2013-04-04 00:54:26
【问题描述】:
有没有一个库有一个在 n 个单词后截断字符串的例程?我正在寻找可以转动的东西:
truncateAfterWords(3, "hello, this\nis a long sentence");
进入
"hello, this\nis"
我可以自己写,但我认为类似的东西可能已经存在于某些开源字符串操作库中。
以下是我希望任何解决方案都能通过的测试用例的完整列表:
import java.util.regex.*;
public class Test {
private static final TestCase[] TEST_CASES = new TestCase[]{
new TestCase(5, null, null),
new TestCase(5, "", ""),
new TestCase(5, "single", "single"),
new TestCase(1, "single", "single"),
new TestCase(0, "single", ""),
new TestCase(2, "two words", "two words"),
new TestCase(1, "two words", "two"),
new TestCase(0, "two words", ""),
new TestCase(2, "line\nbreak", "line\nbreak"),
new TestCase(1, "line\nbreak", "line"),
new TestCase(2, "multiple spaces", "multiple spaces"),
new TestCase(1, "multiple spaces", "multiple"),
new TestCase(3, " starts with space", " starts with space"),
new TestCase(2, " starts with space", " starts with"),
new TestCase(10, "A full sentence, with puncutation.", "A full sentence, with puncutation."),
new TestCase(4, "A full sentence, with puncutation.", "A full sentence, with"),
new TestCase(50, "Testing a very long number of words in the testcase to see if the solution performs well in such a situation. Some solutions don't do well with lots of input.", "Testing a very long number of words in the testcase to see if the solution performs well in such a situation. Some solutions don't do well with lots of input."),
};
public static void main(String[] args){
for (TestCase t: TEST_CASES){
try {
String r = truncateAfterWords(t.n, t.s);
if (!t.equals(r)){
System.out.println(t.toString(r));
}
} catch (Exception x){
System.out.println(t.toString(x));
}
}
}
public static String truncateAfterWords(int n, String s) {
// TODO: implementation
return null;
}
}
class TestCase {
public int n;
public String s;
public String e;
public TestCase(int n, String s, String e){
this.n=n;
this.s=s;
this.e=e;
}
public String toString(){
return "truncateAfterWords(" + n + ", " + toJavaString(s) + ")\n expected: " + toJavaString(e);
}
public String toString(String r){
return this + "\n actual: " + toJavaString(r) + "";
}
public String toString(Exception x){
return this + "\n exception: " + x.getMessage();
}
public boolean equals(String r){
if (e == null && r == null) return true;
if (e == null) return false;
return e.equals(r);
}
public static final String escape(String s){
if (s == null) return null;
s = s.replaceAll("\\\\","\\\\\\\\");
s = s.replaceAll("\n","\\\\n");
s = s.replaceAll("\r","\\\\r");
s = s.replaceAll("\"","\\\\\"");
return s;
}
private static String toJavaString(String s){
if (s == null) return "null";
return " \"" + escape(s) + "\"";
}
}
此网站上有其他语言的解决方案:
【问题讨论】:
-
我不认为有这样的功能,看起来很特别。
-
你可以使用split(),在“”处分割单词,然后计数,超过3个就丢弃其余的。但是不,我从来没有遇到过这样的东西。
-
我想过拆分,但它往往会扔掉你拆分的东西。我想保留字符串中的空格和换行符。
-
而不是使用
String.spilt(),我更喜欢使用Scanner类next()。作为spilt()。阅读更多link -
我在下面的回答也适用于您编辑的输入字符串
hello, this\nis a long sentence。