Java:按字符数拆分字符串,但保证字符串只在空格后拆分

时间:2016-09-06 11:00:02

标签: java string

我想实现这样的目标。

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。

4 个答案:

答案 0 :(得分:4)

"(?<=\\G.{7,}\\s)"上拆分会产生您需要的结果(demo)。

\\G表示上一场比赛结束; .{7,}表示七个或更多字符; \\s表示空格字符。

答案 1 :(得分:0)

不是标准方法,但这可能符合您的需求

http://ideone.com/2RFIZd

上查看
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(打破其他一些答案!)

这会在每个空格后分​​割,然后根据对的长度连接部分或添加到列表中。