2015-01-09 3 views
1

У меня есть программа ниже.Номера подкачки в строке

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 

Здесь замена не завершается, предыдущий номер печатается. пожалуйста, дайте мне знать, как распечатать желаемый результат.

Благодаря

+1

'Шар()' использовать 0 на основе индексов, так 'Шар (5)' является * упс * для ваша строка. –

+1

Также обратите внимание, что этот 'charAt' обречен на неудачу, строка" 19 ", max = 9 .. –

+0

Привет @RC, на основе вашего комментария, я обновил свой код, но здесь я все еще не могу поменять местами, он печатает тот же самый старый номер. – user3872094

ответ

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); 
4

Обратите внимание, что вы передаете методу.

Вы передаете действительный символ в первом и максимальном положениях: 3 и 5 в этом случае.

Но затем, после того, как вы печатаете их, вы звоните:

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

charAt ожидает индекс символа в строке. Индекс должен быть целым числом, но вы передаете ему значение char (символ 3 и символ 5).

Теперь в Java символы считаются числами от 0 до 65535 - значение юникода символа. Таким образом, вы можете передать символ, в котором вы должны были бы передать целое число. Значение unicode 3 равно 51, а для 5 - 53. Таким образом, вы на самом деле говорите «дайте мне символ в строке num, который находится в позиции 51».

Это не то, что вы намеревались.

Вместо того, чтобы сделать это, вы должны сделать метод принять индекс первого символа и индекс от максимального характера. Затем, используя charAt, будет правильно. Но обратите внимание также на использование charAt для печати в начале.

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

другая Ваша проблема заключается в том, что вы на самом деле не меняя символы внутри строки.

Что вы сделали, это замена переменных, содержащих два символа, t и s. Итак, теперь t содержит то, что содержит s, и s содержит то, что содержит t.

Однако это не имеет никакого отношения к исходной строке num. Вы ничего не сделали с самой строкой.

Следует помнить, что в Java вы не можете изменить строку. Это неизменный. Если у вас есть строковый объект, Java не дает вам возможности изменить что-то внутри него. Он позволяет читать только части, а не писать.

Что вам может do присвоить новое строковое значение num. В этой новой строке вы поместите значение максимального символа в позицию 0 и поместите значение того, что было в первой позиции, в положение максимального символа. И вы скопируете все остальные персонажи в тех же местах, где они были.

Итак, вам нужно создать временную строку, петлю на исходном символе строки по символу, и в каждой позиции спросите себя «какой символ я должен добавить в свою новую строку в этом раунде?». Затем добавьте этот символ в строку с оператором +.

Наконец, назначьте новую временную строку num.

(Примечание: есть более эффективные способы сделать это в Java, например, с использованием StringBuffer или StringBuilder, но создается впечатление, что вы еще не участвовали в изучении Java).

+0

Привет, спасибо за быстрый ответ, я изменил свой код на основе вышеизложенного, но проблема в том, что я не могу ее поменять, но он печатает старый номер. :( – user3872094

+0

Thats, потому что вы не изменяете число. Вам нужно что-то вроде: temp = num.charAt (0); num.charAt (0) = num.charAt (maxInt); num.charAt (maxInt) = temp; – ConMan

+0

ОК, я добавил вторую часть к моему ответу. – RealSkeptic

1

Initial - знак. charAt используйте целое число, поэтому символ будет преобразован в код acii 3, который является 51. Таким образом, ваша линия равна `num.charAt (51), и это выходит за пределы диапазона.

Так hyou должны изменить подпись вашего Mathod к private static void swap(String num, int initial, int max)

0

Вот как я мог бы сделать это всего за 3 строки. Обратите внимание, что для цифр символы 1 байт каждый.

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

Не только этот код довольно лаконично - с помощью регулярных выражений для выполнения подкачки в одном операторе - она ​​также автоматически обрабатывает края случая наибольшей цифры остающейся в начале (в этом случае не подходит/замена не будет сделал).


Вот некоторый тестовый код:

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 
Смежные вопросы