【问题标题】:How to move all digits in a string to the beginning of the string?如何将字符串中的所有数字移动到字符串的开头?
【发布时间】:2015-11-18 14:50:23
【问题描述】:

对于以下字符串:

String str="asd14sd67fgh007";

我想要这样的输出:

1467007asdsdfgh

我知道如何分割一个字符串,但我不知道如何得到它。对于拆分,我有以下代码:

public static void main(String[] args) {
    String str="asd14sd67fgh007";
    Pattern pattern = Pattern.compile("\\w+([0-9]+)\\w+([0-9]+)");
    Matcher matcher = pattern.matcher(str);
    for(int i = 0 ; i < matcher.groupCount(); i++) {
        matcher.find();
        System.out.println(matcher.group());
    }
}

【问题讨论】:

  • 不使用正则表达式不是更容易吗?只需扫描字符并将它们分成 2 个单独的StringBuilders

标签: java regex string


【解决方案1】:

2 replaceAll() 可以做到(如果你真的想使用正则表达式:P):

public static void main(String[] args) {
        String s= "asd14sd67fgh007";
        String correctedString = s.replaceAll("\\D+", "") + s.replaceAll("\\d+", "");
        System.out.println(correctedString);
}

O/P:

1467007asdsdfgh

注意:

"\\D+" ==> 将所有非数字字符替换为""。 (将要 给你所有的数字)。

"\\d+" ==> 用"" 替换所有数字(将 给你所有非数字字符)

【讨论】:

  • @Chanakya - Ywc。但这会比其他方法慢:)
  • 好吧,我的意思是代码不太清楚,但我想您可以将它们添加为 cmets 并正确命名方法;)
【解决方案2】:

这是一个使用char[]s 和StringBuilders 的简单解决方案:

String input = "asd14sd67fgh007";
StringBuilder output = new StringBuilder();
// temporary, for storing alphabetic characters
StringBuilder temp = new StringBuilder();
// iterating input's characters one by one
for (char c: input.toCharArray()) {
    // digits, go to output in their order
    if (Character.isDigit(c)) {
        output.append(c);
    }
    // letters, go to temporary to be appended later
    else if (Character.isAlphabetic(c)){
        temp.append(c);
    }
    // punctuation gets lost
}
// appending temporary alphabetics to digits and printing
System.out.println(output.append(temp));

输出

1467007asdsdfgh

【讨论】:

  • 啊没想到#isDigit。不错。
  • 这可能是最快的解决方案:P +1
  • @VinodMadyalkar 也有一个我从未想过的聪明方法。
  • @VinodMadyalkar 是的,你也有一个不错的 :)
  • 重要的是要注意isDigit 除了'0'-'9' (ISO-LATIN-1) 之外还有许多其他 Unicode 数字范围。
【解决方案3】:

你可以做这样的事情。在循环遍历所有chars 时,使用StringBuilder 跟踪前后方向。

String str="asd14sd67fgh007";
StringBuilder front = new StringBuilder(str.length());
StringBuilder back = new StringBuilder(str.length());
for (char c : str.toCharArray()){
    if (c>=48 && c<=57){ //If numeric
        front.append(c);
    }else{
        back.append(c);
    }
}
front.append(back.toString());
System.out.println(front.toString());

输出

1467007asdsdfgh

【讨论】:

  • 嗯。看起来这个比 Mena 的快 :)
  • @VinodMadyalkar 想知道是不是因为代码检查的是 2 个条件而不是 1 个?假设输入字符串是字母数字,Mena 可以将 else if 更改为 else
  • Character.isDigit() 实际上进行了大约 4 到 5 次内部调用以返回 true 或 false。 isAlphabetic() 也不是微不足道的。
  • 将字符串构建器的大小设置为输入字符串的长度可能也是一个好主意,从而避免任何重新分配。
  • @plugwash 感谢您的建议。我已经更新了我的解决方案以反映这一点。 :)
【解决方案4】:

如果不强制使用正则表达式,可以直接使用循环来实现输出:

    String str = "asd14sd67fgh007";
    String digits = "", characters = "";

    for (int i = 0; i < str.length(); ++i) {
        if (Character.isDigit(str.charAt(i))) {
            digits += str.charAt(i);
        } else {
            characters += str.charAt(i);
        }
    }

    System.out.println("Result is :" + digits + characters);

【讨论】:

  • 每次构建一个字符串可能会变得昂贵,具体取决于输入 String 的大小。我建议使用StringBuilder
猜你喜欢
  • 2020-11-08
  • 1970-01-01
  • 1970-01-01
  • 2012-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-03
  • 1970-01-01
相关资源
最近更新 更多