Java在索引处拆分字符串而不剪切单词

Java在索引处拆分字符串而不剪切单词,java,arrays,string,Java,Arrays,String,我只是想知道这是一个API还是一种简单快捷的方法,可以将给定索引中的String拆分为String[]array,但如果该索引中有一个单词,请将其放到其他字符串中 让我们假设我有一个字符串:“我经常往窗外看,但我很少再这样做了” 这个字符串的长度是68,我必须把它剪成36,这是在这个给定的句子中n,但是现在它应该在的处拆分单词,这样数组就成了[“我经常往窗外看”,“窗口,但我很少这样做了” 如果新句子比36长,那么它也应该被拆分,所以如果我的句子长一点:“我过去经常往窗外看,但我现在很少这样做了

我只是想知道这是一个
API
还是一种简单快捷的方法,可以将给定索引中的
String
拆分为
String[]array
,但如果该索引中有一个单词,请将其放到其他字符串中

让我们假设我有一个字符串:
“我经常往窗外看,但我很少再这样做了”

这个字符串的长度是68,我必须把它剪成36,这是在这个给定的句子中n,但是现在它应该在处拆分单词,这样数组就成了
[“我经常往窗外看”,“窗口,但我很少这样做了”

如果新句子比36长,那么它也应该被拆分,所以如果我的句子长一点:
“我过去经常往窗外看,但我现在很少这样做了,尽管我喜欢它”


将是
[“我经常往窗外看”、“窗口,但我很少再这样做了”,“,尽管我喜欢它”

这会重复匹配1到30个字符(贪婪),并且每次匹配后都需要一个空格

public static List<String> chunk(String s, int size) {
    List<String> chunks = new ArrayList<>(s.length()/size+1);
    Pattern pattern = Pattern.compile(".{1," + size + "}(=?\\s|$)");
    Matcher matcher = pattern.matcher(s);
    while (matcher.find()) {
        chunks.add(matcher.group());
    }
    return chunks;
}
公共静态列表块(字符串s,int-size){
列表块=新的ArrayList(s.length()/size+1);
Pattern=Pattern.compile(“.{1,“+size+”}=?\\s |$”);
匹配器匹配器=模式匹配器;
while(matcher.find()){
add(matcher.group());
}
返回块;
}

请注意,如果有一个长字符串(>size)不带空格,则此选项不起作用。

此选项重复匹配1到30个字符(贪婪),并且每个匹配后都需要一个空格

public static List<String> chunk(String s, int size) {
    List<String> chunks = new ArrayList<>(s.length()/size+1);
    Pattern pattern = Pattern.compile(".{1," + size + "}(=?\\s|$)");
    Matcher matcher = pattern.matcher(s);
    while (matcher.find()) {
        chunks.add(matcher.group());
    }
    return chunks;
}
公共静态列表块(字符串s,int-size){
列表块=新的ArrayList(s.length()/size+1);
Pattern=Pattern.compile(“.{1,“+size+”}=?\\s |$”);
匹配器匹配器=模式匹配器;
while(matcher.find()){
add(matcher.group());
}
返回块;
}

请注意,如果有一个不带空格的长字符串(>size),则该方法无效。

这里有一个老式的、非流的、非正则表达式的解决方案:

public static List<String> chunk(String s, int limit) 
{
    List<String> parts = new ArrayList<String>();
    while(s.length() > limit)
    {
        int splitAt = limit-1;
        for(;splitAt>0 && !Character.isWhitespace(s.charAt(splitAt)); splitAt--);           
        if(splitAt == 0) 
            return parts; // can't be split
        parts.add(s.substring(0, splitAt));
        s = s.substring(splitAt+1);
    }
    parts.add(s);
    return parts;
}
输出:

|This is a short string|

|This sentence has a space at chr 36|
|so is a good test|

|I often used to look out of the|
|window, but I rarely do that|
|anymore, even though I liked it|

|I live in|

这里有一个老式的、非流式的、非正则表达式的解决方案:

public static List<String> chunk(String s, int limit) 
{
    List<String> parts = new ArrayList<String>();
    while(s.length() > limit)
    {
        int splitAt = limit-1;
        for(;splitAt>0 && !Character.isWhitespace(s.charAt(splitAt)); splitAt--);           
        if(splitAt == 0) 
            return parts; // can't be split
        parts.add(s.substring(0, splitAt));
        s = s.substring(splitAt+1);
    }
    parts.add(s);
    return parts;
}
输出:

|This is a short string|

|This sentence has a space at chr 36|
|so is a good test|

|I often used to look out of the|
|window, but I rarely do that|
|anymore, even though I liked it|

|I live in|

@PM77-1该问题使用StringTokenizer。现在可以使用字符串#split()@PM77-1来完成该问题,该问题使用StringTokenizer。现在可以使用字符串#split()完成