将由指定字符分隔的String部分重新排序以反转顺序

时间:2012-10-27 11:02:37

标签: java android

我有一个字符串Australia@2@India@30@UK@4@USA@43  我需要反转USA@43@UK@4@India@30@Australia@2

这只是一个示例字符串,实际上String至少有20个@符号。

我已经尝试new StringBuilder(newString).reverse().toString();,但我得到的输出非常奇怪。

4 个答案:

答案 0 :(得分:3)

好的,这是你可以尝试的: -

    String str = "Australia@2@India@30@UK@4@USA@43";

    String[] arr = str.split("(?<![a-zA-Z])@(?<!\\d)");

    StringBuilder builder = new StringBuilder();

    for(int i = arr.length - 1; i >= 0; i--) {
        builder.append(arr[i] + "@");
    }

    // Remove the last `@`
    builder = builder.replace(builder.lastIndexOf("@"), 
                              builder.lastIndexOf("@") + 1, "");

    System.out.println(builder.toString());

输出: -

USA@43@UK@4@India@30@Australia@2

正则表达式的解释: -

(?<![a-zA-Z])@(?<!\\d) - 在任何@之前alphabet上没有succeeded,而digit

之前没有{{1}}

答案 1 :(得分:0)

反向意味着ABC与CBA相反.... 你得到的结果并不奇怪,只是相反顺序中的字符。 您可以根据@

进行拆分

答案 2 :(得分:0)

我不确定这是否是最好的解决方案。我相信可能会有更好的解决方案,但是在代码下面会提供所需的输出:

String s="Australia@2@India@30@UK@4@USA@43";
        String[] sArr = s.split("@");
        String rev="";
        String temp="";
        for(int i= sArr.length-1;i>=0;i--){
            Scanner scan = new Scanner(sArr[i]);
            if(scan.hasNextInt()){
                temp='@'+scan.next();
            }
            else if(scan.hasNext()){
                rev+=scan.next()+temp;
            }
        }
        System.out.println(rev);



OUTPUT:USA@43UK@4India@30Australia@2

答案 3 :(得分:0)

这是一个我能想到的简单解决方案。它使用String.split和StringBuffer类。

public class TestStrings {
    public static void main(String[] args) {        
            String sampleStr = "Australia@2@India@30@UK@4@USA@43";

        String [] strArr = sampleStr.split("@");

        StringBuffer strBuffer = new StringBuffer();
        for(int i=strArr.length-1;i>=0;i=i-2)
    strBuffer.append(strArr[i-1]+"@"+strArr[i]);


        String finalStr = strBuffer.toString().replaceFirst("[@]$", "");
        System.out.println(finalStr);
       }
}

// OUTPUT // USA @ 43UK @ 4India @ 30Australia @ 2