字母数字子字符串排序

时间:2017-01-17 18:50:36

标签: java sorting alphanumeric substring

我需要编写一个java代码来将VBA7425IWC转换为ABV2457CIW。我需要帮助。如果我对字符串进行排序,他们按ASCII值排序,数字变成一个块,字母变成另一个。

3 个答案:

答案 0 :(得分:1)

这个使用正则表达式。您可能需要调整模式以包含小写字母:

import java.util.Arrays;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class SplitRegex {

    public static void main(String[] args) {
        // The search string
        String str = "VBA7425IWC";

        // The Regular expression (Finds {word} tokens)
        Pattern pt = Pattern.compile("[A-Z]+|[0-9]+");

        // Match the string with the pattern
        Matcher m = pt.matcher(str);

        String result = "";
        // If results are found
        while (m.find()) {
            char[] chArray = m.group(0).toCharArray();
            Arrays.sort(chArray);
            result += new String(chArray);
        }
        System.out.println(result);
    }

}

答案 1 :(得分:0)

你的问题在要求上有点模糊。您是否尝试对字符和数字的每个子字符串进行排序?

在这种情况下,您需要确定每个子字符串的范围,表示为从字符到数字的转换。

start = 0
current = 0
for current = 0 to string.length-1:
    if ASCII of current is letter AND ASCII of next is number OR vice-versa:
        sort(string, start, current)
        start = current

您可以通过ASCII值查找字符是否为字母或数字。

答案 2 :(得分:0)

这是一个示例解决方案,我通过将存储在List中的字符串简介数字和字母子字符串分开,然后使用java 8流API进行排序和缩减。

    String s = "VBA7425IWC";
    List<String> mylist = new ArrayList<>();
    StringBuilder subString = new StringBuilder();
    for (int k = 0; k < s.length() - 1; k++) {
        subString.append(s.charAt(k));
        if ((Character.isDigit(s.charAt(k + 1))
                && Character.isAlphabetic(s.charAt(k))) ||
                (Character.isDigit(s.charAt(k))
                        && Character.isAlphabetic(s.charAt(k + 1)))) {
            mylist.add(subString.toString());
            subString.setLength(0);
        }
    }
    mylist.add(subString.append(s.charAt(s.length() - 1)).toString());
    System.out.println(mylist);
    String finalResult = mylist
            .stream()
            .map((myString) -> {
                char[] charArr = myString.toCharArray();
                Arrays.sort(charArr);
                return new String(charArr);

            })
            .reduce("", (s1, s2) -> s1 + s2);