Автор оригинала: Pankaj Kumar.
Обратная строка в java – это хороший вопрос для интервью, связанный с кодированием. Я видел, как интервьюируемый пытался многими способами изменить строку, используя разные способы. Идея этого поста состоит в том, чтобы предоставить некоторые из популярных способов реверсирования строки и, наконец, определить, какой из них является лучшим и правильным способом реверсирования строки.
Переверните строку в Java
Обратная строка с помощью StringBuilder или StringBuffer
Мы знаем, что StringBuffer и StringBuilder классы предоставляют
обратный
метод, поэтому мы можем использовать его для обратного преобразования строки. Ниже приведен фрагмент кода, показывающий, как использовать StringBuilder для изменения строки.Обратная строка с использованием массива символов
Мы можем преобразовать Строку в массив символов , а затем пересечь его в обратном направлении и заполнить из него второй массив символов. Затем используйте второй массив символов для создания строки, которая будет заменена первой. Ниже приведен код для этого подхода.
Обратная строка с использованием массива байтов
Тот же подход, что и с массивом символов, но с использованием массива байтов. Код показан ниже.
Обратная строка Слово за словом
Иногда мы хотим, чтобы слова менялись местами в предложении, а не символ за символом. Ниже приведен простой код, показывающий, как это сделать с помощью функции разделения строк и StringBuilder.
String inputLine = "God is Good"; String[] words = inputLine.split(" "); StringBuilder sb = new StringBuilder(); for (int i = words.length-1; i >= 0; i--) { sb.append(words[i]).append(' '); } //trim to remove last white space System.out.println("Reverse words = '" + sb.toString().trim()+"'");
Лучший способ изменить строку в Java?
Итак, сверху три подхода, который является правильным и лучшим. Как вы можете видеть выше, все три подхода прекрасно работают для простого ввода данных. Если вы читаете класс строк javadoc, в нем есть несколько интересных моментов.
Класс String предоставляет методы для работы с кодовыми точками Юникода (т. е. символами), в дополнение к методам для работы с кодовыми единицами Юникода (т. Е. значениями символов).
Таким образом, похоже, что для некоторых символов Юникода он будет занимать две позиции индекса в массиве символов или массиве байтов. Окажет ли это какое-либо влияние на код, который мы видели выше, чтобы изменить строку. Давайте выясним это, написав простой класс, в котором мы будем принимать пользовательский ввод с помощью класса сканера и отменять его, используя все три вышеперечисленных метода.
package com.journaldev.string; import java.util.Scanner; public class JavaReverseString { public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.println("Enter Input String:"); String input = sc.nextLine(); System.out.println("Enter Input Sentence:"); String inputLine = sc.nextLine(); sc.close(); reverseUsingStringBuilder(input); reverseUsingByteArray(input); reverseUsingCharArray(input); reverseWords(inputLine); } private static void reverseUsingByteArray(String input) { byte[] ba = input.getBytes(); byte[] result = new byte[ba.length]; int len = ba.length; for (byte b : ba) { result[len - 1] = b; len--; } System.out.println("Reversed String using Byte Array = " + new String(result)); } private static void reverseUsingCharArray(String input) { char[] ca = input.toCharArray(); char[] result = new char[ca.length]; int len = ca.length; for (char c : ca) { result[len - 1] = c; len--; } System.out.println("Reversed String using Char Array = " + new String(result)); } private static void reverseUsingStringBuilder(String input) { // use StringBuffer for Java < 1.5 StringBuilder sb = new StringBuilder(input); System.out.println("Reversed String using StringBuilder = " + sb.reverse()); } private static void reverseWords(String inputLine) { String[] words = inputLine.split(" "); StringBuilder sb = new StringBuilder(); for (int i = words.length - 1; i >= 0; i--) { sb.append(words[i]).append(' '); } // trim to remove last white space System.out.println("Reverse words = '" + sb.toString().trim() + "'"); } }
Ниже приведен пример выходных данных для одного из тестовых запусков.
Enter Input String: JournalDev Enter Input Sentence: JournalDev is Good Reversed String using StringBuilder = veDlanruoJ Reversed String using Byte Array = veDlanruoJ Reversed String using Char Array = veDlanruoJ Reverse words = 'Good is JournalDev'
Таким образом, кажется, что все методы отлично работают для обычной строки на основе английских символов. Теперь на рисунке ниже показан другой запуск, в котором символы юникода присутствуют во входной строке.
Таким образом, в приведенном выше сценарии реверс массива байтов не работал должным образом. Однако подход StringBuilder и массива символов работал нормально. Я не пробовал использовать дополнительные символы в качестве входной строки для вышеуказанной программы, но если я посмотрю на javadoc для API обратной функции StringBuilder , там будет написано:
Таким образом, кажется, что дополнительные символы обрабатываются в методе обратного() StringBuilder. Вот почему, если есть какая-либо необходимость изменить строку, я рекомендую использовать метод StringBuilder reverse ().