交换字符串中的数字

时间:2015-01-09 10:26:37

标签: java

我是以下计划。

public class swapping {

    public static void main(String[] args) {
        String num = "31254";

        int max = Integer.MIN_VALUE, maxIndex = 0;
        for (int i = 0; i < num.length(); i++) {
            if (num.charAt(i) > max) {
                max = num.charAt(i);
                maxIndex = i;
            }
        }
        swap(num, num.charAt(0), maxIndex);
    }

    private static void swap(String num, char charAt, int maxIndex) {
         System.out.println("number is " + num + " Initial char is " + charAt
                    + " Maximum is " + maxIndex);
            char t = charAt;
            char s = num.charAt(maxIndex);
            System.out.println("numbers:" + t + " " + s);
            char temp = t;
            t = s;
            s = temp;
            System.out.println("Final string after swap is " + num);
    }

}

这里我的目标是获取要与字符串中的第一个数字交换的字符串中的最大数字。即我想将31254转换为51234。但我不知道该怎么做。

number is 31254 Initial char is 3 Maximum is 3
numbers:3 5
Final string after swap is 31254

此处交换未完成,之前的号码正在打印。请告诉我如何打印所需的输出。

由于

4 个答案:

答案 0 :(得分:4)

注意你传递给方法的内容。

您在第一个和最后一个位置传递实际字符:35

然而,在你打印之后,你打电话给:

    char t = num.charAt(initial);
    char s = num.charAt(max);

charAt需要字符串中字符的索引。索引应该是整数,但是您传递的是 char 值(字符3和字符5)。

现在,在Java中,字符被认为是0到65535之间的数字 - 字符的unicode值。所以它允许你传递一个你应该传递整数的字符。 3的unicode值为51,而5的unicode值为53.所以你实际上是在告诉它“给我字符串num中的字符位置51”。

这不是你想要的。

您应该让方法接受第一个字符的索引最大字符的索引。然后,使用charAt将是正确的。但是请注意在开头使用charAt作为您的打印件。

private static void swap(String num, int initialIndex, int maxIndex) {
    ...
}

你的另一个问题是你实际上并没有交换字符串中的字符。

您所做的是交换包含两个字符ts的变量。现在t包含s包含的内容,s包含t包含的内容。

但是,这与原始字符串num无关。你没有对字符串本身做任何事情。

要记住的一件事是,在Java中,您无法更改字符串。它是不可变的。如果你有一个字符串对象,Java不会给你任何改变其中内容的方法。它只允许你阅读它的一部分,而不是写。

可以做的是将新的字符串值分配给num。在这个新字符串中,您将把max字符的值放在0位置,并将第一个位置的值放在最大字符位置。并且你将所有其他角色复制到它们所在的相同位置。

所以你需要创建一个临时字符串,逐个字符地循环原始字符串,并在每个位置,问问自己“我应该在这一轮中添加到我的新字符串中的哪个字符?”。然后使用+运算符将该字符添加到字符串中。

最后,将新的临时字符串分配给num

(注意:在Java中有更有效的方法,比如使用StringBufferStringBuilder,但我得到的印象是你的Java研究还没有。

答案 1 :(得分:3)

尝试以下程序。

String num = "31254";

    int maxIndex = 0;
    char maxString = num.charAt(0);
    for (int i = 1; i < num.length(); i++) {
        if (num.charAt(i) > maxString) {
            maxString = num.charAt(i);
            maxIndex = i;
        }
    }
    System.out.println(maxString);
    System.out.println(maxIndex);

    String str1 = num.substring(1,maxIndex);
    String str2 = num.substring(maxIndex+1,num.length());
    String str3 = num.charAt(maxIndex)+str1+num.charAt(0)+str2;
    System.out.println(str3);

答案 2 :(得分:1)

Initial是一个字母。 charAt使用整数,因此char将以3的{​​{1}}的acii代码转换为51。所以你的行等于`num.charAt(51),这超出了范围。

因此,你必须将你的方法的签名改为private static void swap(String num, int initial, int max)

答案 3 :(得分:0)

这是我如何只用3行就能做到的。请注意,对于数字,字符每个都是1个字节。

byte[] array = number.getBytes();
Arrays.sort(array);
number = number.replaceFirst("(.)(.*?)(" + (array[array.length - 1] - '0') + ")", "$3$2$1");

这个代码不仅非常简洁 - 使用正则表达式在一个语句中执行交换 - 它还会自动处理开始时最大数字的边缘情况(在这种情况下不会进行匹配/替换)。 / p>


这是一些测试代码:

String number = "31254";
byte[] array = number.getBytes();
Arrays.sort(array);
number = number.replaceFirst("(.)(.*?)(" + (array[array.length - 1] - '0') + ")", "$3$2$1");
System.out.println(number);

输出:

51234