给定一个 string/text,我怎样才能从给定的 string/text 中取出后面的每一对字母?

Given a string/text, how can I take each following pair of letters from the given string/text?

给定一个字符串,我如何取每对字母?

这里有一个例子,给定string = "asdfg",代码输出arr[as,df,g_]; 给定字符串 = "asdfgghk",代码输出 arr[as,df,gg,hk].

如果字符串长度为奇数,则最后一对将是 char[i]_,(下划线)

这是我写的部分代码:


    public static char
    getCharFromString(String s, int index) 
    { 
        return s.charAt(index); 
    } 
    public static String[] solution(String s) {
        char a, b;
        String[] arr = new String[(s.length() / 2)];
        for(int i = 0; i < s.length(); i+=2) {
            if(s.length() % 2 == 0) {
                 a = getCharFromString(s, i);
                 b = getCharFromString(s, i + 1);
                arr[i] = a + b ;
            }
            else {
                a = getCharFromString(s, i);
                b = getCharFromString(s, i + 1);
                arr[i] = a + b ;
                if(i == s.length()) {
                    b = "_";
                }   
            }
        }
        return arr;
    }

众多解决方案之一:

public static String[] solution(String s) {
    int arrayLen = s.isEmpty() ? 1 : (int) Math.ceil(s.length() / 2.0);
    String[] arr = new String[arrayLen];

    for (int i = 0; i < arrayLen; i++) {
        arr[i] = s.substring(Math.min(s.length(), i * 2), Math.min(s.length(), i * 2 + 2));
    }
    if (arr[arrayLen - 1].length() == 1) {
        arr[arrayLen - 1] = arr[arrayLen - 1] + "_";
    } else if (arr[arrayLen - 1].isEmpty()){
        arr[arrayLen - 1] = "__";
    }

    return arr;
}

使用正则表达式非常容易。只需将字符串拆分为每 2 个字符,如果数组的最后一个元素缺少一个字符,则向其附加 _

演示:

import java.util.Arrays;

public class Main {
    public static void main(String[] args) {
        // Test
        System.out.println(Arrays.toString(solution("asdfg")));
        System.out.println(Arrays.toString(solution("asdfgghk")));
    }

    public static String[] solution(String s) {
        // Split the string on every 2 characters
        String[] arr = s.split("(?<=\G..)");

        // If the last element of the array is short of one character, append '_' to it
        if (arr.length > 1 && arr[arr.length - 1].length() != 2) {
            arr[arr.length - 1] += "_";
        }
        return arr;
    }
}

输出:

[as, df, g_]
[as, df, gg, hk]

注意: 正则表达式 (?<=\G..) 已在下面解释:

  1. \G 断言位置在前一个匹配的末尾或第一个匹配的字符串的开头
  2. . 匹配任何字符(行终止符除外)