Обратная строка в Java


467

я имею "Hello World" держал в строковой переменной с именем hi.

Мне нужно распечатать, но в обратном порядке.

Как я могу это сделать? Я понимаю, что в Java уже встроена какая-то функция, которая делает это.

Связанный: Обратное каждое отдельное слово строки «Hello World» с Java


7
@JRL действительно должен быть String ih = "dlroW olleH"; System.out.println (Ih);
Мэтью Фарвелл

4
Я хотел бы отозвать свой закрытый голос (как дубликат). Я перечитал другой вопрос и понял, что он немного отличается от этого. Тем не менее, этот вопрос все еще дублируется на сайте. Вероятно, следует просто найти другой вопрос, чтобы отметить это обман.
Роб Хруска

Вы можете использовать функцию reverse () класса StringBuilder, метод toCharArray (), обмен символов и многое другое. обратитесь к этому ресурсу для получения дополнительных примеров, flowerbrackets.com/2-best-ways-to-reverse-a-string-in-java
Шива

StringBuilder.reverse () - более удобное и понятное решение.
Lokesh

Ответы:


980

Вы можете использовать это:

new StringBuilder(hi).reverse().toString()

Или для версий более ранних, чем JDK 1.5, используйте java.util.StringBufferвместо StringBuilder- они имеют одинаковый API. Спасибо комментаторам за то, что они указали, что StringBuilderпредпочтительнее в настоящее время, когда нет проблем с параллелизмом.


13
«Спасибо комментаторам за то, что они указали, что StringBuilder является предпочтительным в настоящее время»? Существует четкое утверждение, что StringBuffer, если безопасность потока является проблемой. в противном случае можно использовать StringBuilder. StringBuilder не является заменой StringBuffer.
ha9u63ar

15
@ ha9u63ar Для этого сценария с локальным одноразовым StringBuilderпараллелизмом это не проблема (и я думаю, именно это он имел в виду).
xehpuk

2
Вот ссылка, чтобы узнать точное различие между ними: javatpoint.com/… короче: StringBuilder более эффективен, чем StringBuffer. Это не потокобезопасно, то есть несколько потоков могут одновременно вызывать методы StringBuilder.
Вишну Наранг

Это не будет работать для символов Юникода за пределами BMP, пока для объединения символов.
Нау

2
@ Даниэль Брокман, Спасибо за ваш хороший и краткий ответ. Здесь OP сказал: «Hello World» хранится в строковой переменной с именем hi . Это значит String hi = "Hello World";. Так что я думаю , что в своем ответе должна не быть никакой двойная кавычка hi. Я имею в виду, что это должно быть такnew StringBuilder(hi).reverse().toString()
Md. Абу Нафи Ибна Захид

109

Для проблем с онлайн-судьями, которые не разрешают StringBuilderили StringBuffer, вы можете сделать это на месте, используя char[]следующее:

public static String reverse(String input){
    char[] in = input.toCharArray();
    int begin=0;
    int end=in.length-1;
    char temp;
    while(end>begin){
        temp = in[begin];
        in[begin]=in[end];
        in[end] = temp;
        end--;
        begin++;
    }
    return new String(in);
}

Просто заметка, хотя. Это ужасно потерпит неудачу для «символов», которые занимают два байта.
Минас Мина

На самом деле, это нормально работает для большинства символов, которые занимают 2 байта. То, для чего это фактически терпит неудачу, является кодовыми точками Unicode, которые занимают 2 x 16-битных кодовых единиц (в UTF-16).
Стивен С

Это хорошее решение, но можем ли мы сделать то же самое, если у нас есть 10 000 символов в строке с минимальной сложностью.
Джатиндер Кумар

62
public static String reverseIt(String source) {
    int i, len = source.length();
    StringBuilder dest = new StringBuilder(len);

    for (i = (len - 1); i >= 0; i--){
        dest.append(source.charAt(i));
    }

    return dest.toString();
}

http://www.java2s.com/Code/Java/Language-Basics/ReverseStringTest.htm


4
Хорошее решение (1+). Одно из улучшений - StringBuilder (начиная с java5) будет быстрее, чем StringBuffer. С уважением.
Михал Шрайер

31
Это не будет работать в общем случае, так как не учитывает, что некоторые «символы» в юникоде представлены суррогатной парой, то есть двумя символами Java, и это решение приводит к тому, что пара находится в неправильном порядке. Обратный метод StringBuilder должен быть тонким в соответствии с JavaDoc: docs.oracle.com/javase/7/docs/api/java/lang/...
Ян Fairman

59
String string="whatever";
String reverse = new StringBuffer(string).reverse().toString();
System.out.println(reverse);

7
Какова сложность этого? O (N) или больше? N равно длине строки.
Mukit09

O (n), поскольку он должен перебирать символы строки хотя бы один раз.
PlsWork

26

Я делаю это с помощью следующих двух способов:

Обратная строка по CHARACTERS:

public static void main(String[] args) {
    // Using traditional approach
    String result="";
    for(int i=string.length()-1; i>=0; i--) {
        result = result + string.charAt(i);
    }
    System.out.println(result);

    // Using StringBuffer class
    StringBuffer buffer = new StringBuffer(string);
    System.out.println(buffer.reverse());    
}

Обратная строка по словам:

public static void reverseStringByWords(String string) {
    StringBuilder stringBuilder = new StringBuilder();
    String[] words = string.split(" ");

    for (int j = words.length-1; j >= 0; j--) {
        stringBuilder.append(words[j]).append(' ');
    }
    System.out.println("Reverse words: " + stringBuilder);
}

19

Взгляните на API Java 6 под StringBuffer

String s = "sample";
String result = new StringBuffer(s).reverse().toString();

это лучше, чем StringBuilder?
CamHart

@ CamHart Нет, это медленнее, но, вероятно, только чуть-чуть.
jcsahnwaldt говорит GoFundMonica

1
Небольшой тест с почти 100 миллионами вызовов методов показал значительную разницу между StringBuffer и StringBuilder: stackoverflow.com/questions/355089/… Но в этом случае есть только два вызова ( reverse()и toString()), поэтому разница, вероятно, даже не будет измеримы.
jcsahnwaldt говорит GoFundMonica

17

Вот пример использования рекурсии:

public void reverseString() {
    String alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    String reverseAlphabet = reverse(alphabet, alphabet.length()-1);
}

String reverse(String stringToReverse, int index){
    if(index == 0){
        return stringToReverse.charAt(0) + "";
    }

    char letter = stringToReverse.charAt(index);
    return letter + reverse(stringToReverse, index-1);
}

2
Уже есть гораздо лучшие ответы, особенно @ DanielBrockman's. Если алгоритм уже существует в стандартной библиотеке, нет необходимости создавать его вручную и заново изобретать колесо.
Вилли Ментцель

14
Понятие «гораздо лучший ответ» субъективно. Это может быть именно то, что кто-то ищет.
C0D3LIC1OU5

2
ОП уже заявил, что «в Java уже встроена какая-то функция, которая делает это», поэтому его целью было точно узнать, что это за «функция». Просто публиковать ответ, который не имеет ничего общего с заданным вопросом, не имеет смысла. Если бы кто-то попросил индивидуальную реализацию, ваш ответ был бы оправданным, в этом случае это не так.
Вилли Ментцель

Downvote. Большинство других решений - это O (n) и может обрабатывать строки практически любой длины, это O (n ^ 2) и может привести к сбою со StackOverflowError для строк длиннее, чем около 5000 символов (на виртуальной машине JDK 8, конфигурация по умолчанию) ,
jcsahnwaldt говорит GoFundMonica

1. Другие решения не используют рекурсию и могут прекрасно обрабатывать длинные строки. Зачем вам использовать рекурсию вместо итерации для такой задачи? Это не имеет никакого смысла. (За исключением случаев, когда вы работаете в среде функционального программирования, что часто приводит к проблемам, когда вы пишете код на языке императива / OO.) 2. Конкатенация строк (это невинный маленький '+') - это O (n). Вы должны быть новичком в Java, иначе вы бы это знали.
jcsahnwaldt говорит GoFundMonica

12

Вот решение низкого уровня:

import java.util.Scanner;

public class class1 {

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String inpStr = in.nextLine();
        System.out.println("Original String :" + inpStr);
        char temp;
        char[] arr = inpStr.toCharArray();
        int len = arr.length;
        for(int i=0; i<(inpStr.length())/2; i++,len--){
            temp = arr[i];
            arr[i] = arr[len-1];
            arr[len-1] = temp;
        }

        System.out.println("Reverse String :" + String.valueOf(arr));
    }
}

12

Я пытался, просто для удовольствия, используя стек. Вот мой код:

public String reverseString(String s) {
    Stack<Character> stack = new Stack<>();
    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < s.length(); i++) {
        stack.push(s.charAt(i));
    }
    while (!stack.empty()) {
        sb.append(stack.pop());
    }
    return sb.toString();

}

11

Поскольку приведенный ниже метод (использующий XOR ) для обращения строки не указан, я прилагаю этот метод для обращения строки.

Алгоритм основан на:

1. (A XOR B) XOR B = A

2. (A XOR B) XOR A = B

Фрагмент кода:

public class ReverseUsingXOR {
    public static void main(String[] args) {
        String str = "prateek";
        reverseUsingXOR(str.toCharArray());
    }   

    /*Example:
     * str= prateek;
     * str[low]=p;
     * str[high]=k;
     * str[low]=p^k;
     * str[high]=(p^k)^k =p;
     * str[low]=(p^k)^p=k;
     * 
     * */
    public static void reverseUsingXOR(char[] str) {
        int low = 0;
        int high = str.length - 1;

        while (low < high) {
            str[low] = (char) (str[low] ^ str[high]);
            str[high] = (char) (str[low] ^ str[high]);   
            str[low] = (char) (str[low] ^ str[high]);
            low++;
            high--;
        }

        //display reversed string
        for (int i = 0; i < str.length; i++) {
            System.out.print(str[i]);
        }
    }

}

Вывод:

keetarp


8

Как уже отмечали другие, предпочтительным способом является использование:

new StringBuilder(hi).reverse().toString()

Но если вы хотите реализовать это самостоятельно, я боюсь, что остальные ответы имеют недостатки.

Причина в том, что Stringпредставляет список точек Unicode , закодированных в char[]массиве в соответствии с кодировкой переменной длины: UTF-16 .

Это означает, что некоторые кодовые точки используют один элемент массива (одну кодовую единицу), но другие используют два из них, поэтому могут существовать пары символов, которые должны рассматриваться как одна единица (последовательные суррогаты "high" и "low") ,

public static String reverseString(String s) {
    char[] chars = new char[s.length()];
    boolean twoCharCodepoint = false;
    for (int i = 0; i < s.length(); i++) {
        chars[s.length() - 1 - i] = s.charAt(i);
        if (twoCharCodepoint) {
            swap(chars, s.length() - 1 - i, s.length() - i);
        }
        twoCharCodepoint = !Character.isBmpCodePoint(s.codePointAt(i));
    }
    return new String(chars);
}

private static void swap(char[] array, int i, int j) {
    char temp = array[i];
    array[i] = array[j];
    array[j] = temp;
}

public static void main(String[] args) throws Exception {
    FileOutputStream fos = new FileOutputStream("C:/temp/reverse-string.txt");
    StringBuilder sb = new StringBuilder("Linear B Syllable B008 A: ");
    sb.appendCodePoint(65536); //http://unicode-table.com/es/#10000
    sb.append(".");
    fos.write(sb.toString().getBytes("UTF-16"));
    fos.write("\n".getBytes("UTF-16"));
    fos.write(reverseString(sb.toString()).getBytes("UTF-16"));
}

Хорошее решение, пропущена только часть, теперь обрабатывается комбинация диакритических знаков :-D
Рене

6

Это очень просто в минимальном коде строк

public class ReverseString {
    public static void main(String[] args) {
        String s1 = "neelendra";
        for(int i=s1.length()-1;i>=0;i--)
            {
                System.out.print(s1.charAt(i));
            }
    }
}

Я собирался написать это сейчас .. Нашел, вы уже написали это!
Дженси

4

Это помогло мне

public static void main(String[] args) {

    String text = "abcdefghijklmnopqrstuvwxyz";

    for (int i = (text.length() - 1); i >= 0; i--) {
        System.out.print(text.charAt(i));
    }
}

4

1. Использование массива символов:

public String reverseString(String inputString) {
    char[] inputStringArray = inputString.toCharArray();
    String reverseString = "";
    for (int i = inputStringArray.length - 1; i >= 0; i--) {
        reverseString += inputStringArray[i];
    }
    return reverseString;
}

2. Использование StringBuilder:

public String reverseString(String inputString) {
    StringBuilder stringBuilder = new StringBuilder(inputString);
    stringBuilder = stringBuilder.reverse();
    return stringBuilder.toString();
}

ИЛИ

return new StringBuilder(inputString).reverse().toString();

3
System.out.print("Please enter your name: ");
String name = keyboard.nextLine();

String reverse = new StringBuffer(name).reverse().toString();
String rev = reverse.toLowerCase();
System.out.println(rev);

Я использовал этот метод, чтобы превратить имена назад и в нижний регистр.


2
    public String reverse(String s) {

        String reversedString = "";
        for(int i=s.length(); i>0; i--) {
            reversedString += s.charAt(i-1);
        }   

        return reversedString;
    }

Опять же, суррогатные пары будут испорчены таким образом.
HyperNeutrino

@JamesSmith, не могли бы вы рассказать об этом подробнее?
Дом Шахбази

1
Некоторые символы Юникода состоят из двух символов; если эти два переключаются, строка повреждена. Кроме того, одной из часто пропускаемых ошибок является регулярное выражение.
HyperNeutrino

2

Один естественный способ обратить вспять это Stringиспользовать a StringTokenizerи стек. Stackявляется классом, который реализует простой в использовании стек объектов LIFO.

String s = "Hello My name is Sufiyan";

Положите его в стек вперед

Stack<String> myStack = new Stack<>();
StringTokenizer st = new StringTokenizer(s);
while (st.hasMoreTokens()) {
     myStack.push(st.nextToken());
}

Распечатать стопку назад

System.out.print('"' + s + '"' + " backwards by word is:\n\t\"");
while (!myStack.empty()) {
  System.out.print(myStack.pop());
  System.out.print(' ');
}

System.out.println('"');


2

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

Это полезно для тех, кто ищет рекурсивный способ сделать обратную строку.

public class ReversString {

public static void main(String args[]) {
    char s[] = "Dhiral Pandya".toCharArray();
    String r = new String(reverse(0, s));
    System.out.println(r);
}

public static char[] reverse(int i, char source[]) {

    if (source.length / 2 == i) {
        return source;
    }

    char t = source[i];
    source[i] = source[source.length - 1 - i];
    source[source.length - 1 - i] = t;

    i++;
    return reverse(i, source);

}

}

2

Процедура :

Мы можем использовать split () для разделения строки. Затем используем обратный цикл и добавляем символы.


Фрагмент кода:

class test
{
  public static void main(String args[]) 
  {
      String str = "world";
      String[] split= str.split("");

      String revers = "";
      for (int i = split.length-1; i>=0; i--)
      {
        revers += split[i];
      }
      System.out.printf("%s", revers);
   }  
}

 //output : dlrow


1

public String reverseWords (String s) {

    String reversedWords = "";

    if(s.length()<=0) {
        return reversedWords;
    }else if(s.length() == 1){
        if(s == " "){
            return "";
        }
        return s;
    }

    char arr[] = s.toCharArray();
    int j = arr.length-1;
    while(j >= 0 ){
        if( arr[j] == ' '){
            reversedWords+=arr[j];
        }else{
            String temp="";
            while(j>=0 && arr[j] != ' '){
                temp+=arr[j];
                j--;
            }
            j++;
            temp = reverseWord(temp);
            reversedWords+=temp;
        }
        j--;

    }

    String[] chk = reversedWords.split(" ");

    if(chk == null || chk.length == 0){
        return "";
    }

    return reversedWords;



}

public String reverseWord(String s){

    char[] arr = s.toCharArray();

    for(int i=0,j=arr.length-1;i<=j;i++,j--){
        char tmp = arr[i];
        arr[i] = arr[j];
        arr[j] = tmp;
    }
    return String.valueOf(arr);

}

1

Вы также можете попробовать это:

public class StringReverse {
    public static void main(String[] args) {
        String str = "Dogs hates cats";
        StringBuffer sb = new StringBuffer(str);
        System.out.println(sb.reverse());
    }
}

1
Есть много методов, чтобы перевернуть строку. Это один из них, использующий класс stringbuffer из java.accepted ответ использует разностный класс, который недоступен в более старой версии JDK.
Анураг Гоэль

1
public void reverString(){
System.out.println("Enter value");
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
 try{

  String str=br.readLine();
  char[] charArray=str.toCharArray();
  for(int i=charArray.length-1; i>=0; i--){
   System.out.println(charArray[i]);
  }
  }
   catch(IOException ex){
  }

1

рекурсии:

 public String stringReverse(String string) {
    if (string == null || string.length() == 0) {
        return string;
    }
    return stringReverse(string.substring(1)) + string.charAt(0);
 }

1

Просто для удовольствия .. :)

Algorithm (str,len)
char reversedStr[] =new reversedStr[len]

Пройдите от 0 до len / 2, а затем

reversedStr[i]=str[len-1-i]  
reversedStr[len-1=i]=str[i]
return reversedStr;

Сложность времени: O (n)

Космическая сложность: O (n)

public class Reverse {
    static char reversedStr[];

    public static void main(String[] args) {
        System.out.println(reversestr("jatin"));
    }


    private static String reversestr(String str) {
        int strlen = str.length();
        reversedStr = new char[strlen];

        for (int i = 0; i <= strlen / 2; i++) {
            reversedStr[i] = str.charAt(strlen - 1 - i);
            reversedStr[strlen - 1 - i] = str.charAt(i);

        }
        return new String(reversedStr);
    }

}

1
public static String revString(String str){
    char[] revCharArr = str.toCharArray();
    for (int i=0; i< str.length()/2; i++){
        char f = revCharArr[i];
        char l = revCharArr[str.length()-i-1];
        revCharArr[i] = l;
        revCharArr[str.length()-i-1] = f;
    }
    String revStr = new String(revCharArr);
    return revStr;
}

1
    public static void reverseString(String s){
        System.out.println("---------");
        for(int i=s.length()-1; i>=0;i--){
            System.out.print(s.charAt(i));    
        }
        System.out.println(); 

    }

Это просто выводит символ строки один за другим. И также это не может быть использовано где-либо в программе. Гораздо лучше создать строковую переменную, вставить в строку символ «char», а затем вернуть строку.
Зомби Чиби XD

1
    //Solution #1 -- Using array and charAt()
    String name = "reverse"; //String to reverse
    Character[] nameChar =  new Character[name.length()]; // Declaring a character array with length as length of the String which you want to reverse.
    for(int i=0;i<name.length();i++)// this will loop you through the String
    nameChar[i]=name.charAt(name.length()-1-i);// Using built in charAt() we can fetch the character at a given index. 
    for(char nam:nameChar)// Just to print the above nameChar character Array using an enhanced for loop
    System.out.print(nam);


    //Solution #2 - Using StringBuffer and reverse ().
    StringBuffer reverseString = new StringBuffer("reverse");
    System.out.println(reverseString.reverse()); //reverse () Causes the character sequence to be replaced by the reverse of the sequence.

@ Дарман спасибо за ответ. добавлено объяснение и еще одно решение.
абхи

0
package logicprogram;
import java.io.*;

public class Strinrevers {
public static void main(String args[])throws IOException
{
    BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
    System.out.println("enter data");
    String data=br.readLine();
    System.out.println(data);
    String str="";
    char cha[]=data.toCharArray();

    int l=data.length();
    int k=l-1;
    System.out.println(l);


    for(int i=0;k>=i;k--)
    {

        str+=cha[k];


    }
    //String text=String.valueOf(ch);
    System.out.println(str);

}

}

0
import java.util.Scanner;

public class Test {

    public static void main(String[] args){
        Scanner input = new Scanner (System.in);
        String word = input.next();
        String reverse = "";
        for(int i=word.length()-1; i>=0; i--)
            reverse += word.charAt(i);
        System.out.println(reverse);        
    }
}

Если вы хотите использовать простой цикл for!

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.