如何在Java中按位置拆分字符串

11

我没有找到任何答案.. 如果我有: String s = "How are you"? 如何将其拆分为两个字符串,第一个字符串包含从0..s.length()/2,第二个字符串包含从s.length()/2+1..s.length()

谢谢!


@roddik:鉴于length和2都是整数,这将进行整数除法,导致第一个字符串比第二个字符串短。 - Powerlord
7个回答

26

这样应该就可以了:

String s = "How are you?";
String first = s.substring(0, s.length() / 2);  // gives "How ar"
String second = s.substring(s.length() / 2);    // gives "e you?"

(请注意,如果字符串长度为奇数,由于整数除法中的四舍五入,secondfirst 多一个字符。)


6
String s0 = "How are you?";
String s1 = s0.subString(0, s0.length() / 2);
String s2 = s0.subString(s0.length() / 2);

只要s0不是null。 编辑 这个方法适用于奇数长度的字符串,因为你没有将任何一个索引加1。令人惊讶的是,它甚至可以在长度为零的字符串“”上正常工作。

5
你可以使用 'substring(start, end)',但在此之前请确保字符串不为null:
String first = s.substring(0, s.length() / 2);
String second = s.substring(s.length() / 2);

你是否希望字符串长度为奇数?如果是,那么你需要添加逻辑来正确处理这种情况。


但这根本不起作用... 它返回 "re you""e you" - aioobe
@Torres,不,那会错过中间的字符。(并在空字符串上引发异常) - aioobe
1
Alois的答案是不正确的,Torres也是不正确的。正确的答案是String s = "How are you?"; String first = s.substring(0, s.length() / 2); String second = s.substring(s.length() / 2); - Ralph
我提供了一些提示,并解释了方法的工作原理。很抱歉,它并不打算完全覆盖要求。现在已经进行了更正... - Alois Cochard

4
这里有一种方法可以通过长度将字符串分成n个部分。(如果字符串的长度不能被n整除,最后一个部分将更短。)
public static String[] splitInEqualParts(final String s, final int n){
    if(s == null){
        return null;
    }
    final int strlen = s.length();
    if(strlen < n){
        // this could be handled differently
        throw new IllegalArgumentException("String too short");
    }
    final String[] arr = new String[n];
    final int tokensize = strlen / n + (strlen % n == 0 ? 0 : 1);
    for(int i = 0; i < n; i++){
        arr[i] =
            s.substring(i * tokensize,
                Math.min((i + 1) * tokensize, strlen));
    }
    return arr;
}

测试代码:

/**
 * Didn't use Arrays.toString() because I wanted to have quotes.
 */
private static void printArray(final String[] arr){
    System.out.print("[");
    boolean first = true;
    for(final String item : arr){
        if(first) first = false;
        else System.out.print(", ");
        System.out.print("'" + item + "'");
    }
    System.out.println("]");
}

public static void main(final String[] args){

    printArray(splitInEqualParts("Hound dog", 2));
    printArray(splitInEqualParts("Love me tender", 3));
    printArray(splitInEqualParts("Jailhouse Rock", 4));

}

输出:

['猎犬', '狗']
['爱', '我', '温柔']
['监狱摇滚']


2
使用 String.substring(int)String.substring(int, int) 方法。
int cutPos = s.length()/2;
String s1 = s.substring(0, cutPos);
String s2 = s.substring(cutPos, s.length()); //which is essentially the same as
//String s2 = s.substring(cutPos);

你犯了一个错误:substring(beginPosition)。因此,substring(cutPos)并不等同于substring(0, cutPos)。 - Yuri.Bulkin
不要使用s.substring(cutPos + 1, s.length());,而是使用s.substring(cutPos + 1); - Mot
抱歉,这也不起作用。如果您将“cutPos -”更改为“cutPos =”,则会返回“How a”和“e you”。 - aioobe
@aioobe,谢谢……s2上的cutPos + 1导致了问题。我已经修复了它。 - Buhake Sindi
@The Elite Gentleman,您可能也想将第一个“-”改为“=”。 - aioobe

2
我没有在任何地方找到答案。 你应该首先查看相关类的Java文档,例如在这种情况下是java.lang.String。Javadoc可以:

0
public int solution(final String S, final int K) {
    int splitCount = -1;
    final int count = (int) Stream.of(S.split(" ")).filter(v -> v.length() > K).count();
    if (count > 0) {
        return splitCount;
    }

    final List<String> words = Stream.of(S.split(" ")).collect(Collectors.toList());
    final List<String> subStrings = new ArrayList<>();
    int counter = 0;
    for (final String word : words) {
        final StringJoiner sj = new StringJoiner(" ");
        if (subStrings.size() > 0) {
            final String oldString = subStrings.get(counter);
            if (oldString.length() + word.length() <= K - 1) {
                subStrings.set(counter, sj.add(oldString).add(word).toString());
            } else {
                counter++;
                subStrings.add(counter, sj.add(word).toString());
            }
        } else {
            subStrings.add(sj.add(word).toString());
        }
    }

    subStrings.forEach(
            v -> {
                System.out.printf("[%s] and length %d\n", v, v.length());
            }
    );
    splitCount = subStrings.size();
    return splitCount;
}

公共静态无返回值主函数(final String[] args) {

    final MessageSolution messageSolution = new MessageSolution();
    final String message = "SMSas5 ABC DECF HIJK1566 SMS POP SUV XMXS MSMS";
    final int maxSize = 11;
    System.out.println(messageSolution.solution(message, maxSize));

}

请在您的代码中添加解释,以便其他读者能够理解。 - Genhis
将指定长度的字符串拆分,不考虑单词间断。预期输入不包含前导或尾随空格。 - JyotiKumarPoddar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接