我想实现这样的目标。
String str = "This is just a sample string";
List<String> strChunks = splitString(str,8);
和strChunks
应该是这样的:
"This is ","just a ","sample ","string."
请注意字符串&#34; sample&#34;只有7个字符和8个字符,它将是&#34;样本s&#34;这将打破我的下一个词&#34; string&#34;。
此外,我们可以假设一个单词永远不会大于方法的第二个参数(在示例中为8),因为在我的用例中,第二个参数始终是静态的,值为32000.
我能想到的显而易见的方法是通过给定的字符串循环,在8个字符之后断开字符串,然后从末尾搜索下一个空格。然后再次重复相同的事情以保留字符串。
有没有更优雅的方式来实现同样的目标。在一些标准的第三个库中是否有任何实用方法,如Guava,Apache Commons。
答案 0 :(得分:4)
在"(?<=\\G.{7,}\\s)"
上拆分会产生您需要的结果(demo)。
\\G
表示上一场比赛结束; .{7,}
表示七个或更多字符; \\s
表示空格字符。
答案 1 :(得分:0)
不是标准方法,但这可能符合您的需求
上查看public static List<String> splitString(String str, int chunksize) {
char[] chars = str.toCharArray();
ArrayList<String> list = new ArrayList<String>();
StringBuilder builder = new StringBuilder();
int count = 0;
for(char character : chars) {
if(count < chunksize - 1) {
builder.append(character);
count++;
}
else {
if(character == ' ') {
builder.append(character);
list.add(builder.toString());
count = 0;
builder.setLength(0);
}
else {
builder.append(character);
count++;
}
}
}
list.add(builder.toString());
builder.setLength(0);
return list;
}
请注意,我使用人工符号作为字符串长度,因为那是您的样本反映的内容(8 =字符串中的位置7)。这就是chunksize - 1
存在的原因。
对于大小为http://catdir.loc.gov/catdir/enhancements/fy0711/2006051179-s.html
的文本,此方法需要3毫秒答案 2 :(得分:0)
使用方法1拆分字符串。
String text="This is just a sample string";
List<String> strings = new ArrayList<String>();
int index = 0;
while (index < text.length()) {
strings.add(text.substring(index, Math.min(index + 8,text.length())));
index += 8;
}
for(String s : strings){
System.out.println("["+s+"]");
}
使用方法2拆分字符串
String[] s=text.split("(?<=\\G.{"+8+"})");
for (int i = 0; i < s.length; i++) {
System.out.println("["+s[i]+"]");
}
答案 3 :(得分:0)
这使用黑客攻击减少来完成它而没有太多代码:
String str = "This is just a sample string";
List<String> parts = new ArrayList<>();
parts.add(Arrays.stream(str.split("(?<= )"))
.reduce((a, b) -> {
if (a.length() + b.length() <= 8)
return a + b;
parts.add(a);
return b;
}).get());
使用边缘案例输入查看demo(打破其他一些答案!)
这会在每个空格后分割,然后根据对的长度连接部分或添加到列表中。