Membalikkan string di Jawa

467

Saya telah "Hello World"menyimpan variabel bernama String hi.

Saya perlu mencetaknya, tetapi terbalik.

Bagaimana saya bisa melakukan ini? Saya mengerti ada semacam fungsi yang sudah ada di dalam Java yang melakukan itu.

Terkait: Balikkan setiap kata dari string "Hello World" dengan Java

Ron
sumber
7
@ JRL harus benar-benar menjadi String ih = "dlroW olleH"; System.out.println (ih);
Matthew Farwell
4
Saya berharap saya bisa menarik kembali suara dekat saya (sebagai duplikat). Saya membaca kembali pertanyaan lain dan menyadari bahwa ini agak berbeda dari ini. Namun, pertanyaan ini masih digandakan berkali-kali di seluruh situs. Mungkin harus mencari pertanyaan yang berbeda untuk menandai ini penipuan.
Rob Hruska
Anda dapat menggunakan fungsi reverse () dari kelas StringBuilder, metode toCharArray (), bertukar karakter dan banyak lagi. lihat sumber daya ini untuk lebih banyak contoh, flowerbrackets.com/2-best-ways-to-reverse-a-string-in-java
Shiva
StringBuilder.reverse () adalah solusi yang lebih mudah dibaca dan elegan.
lokesh

Jawaban:

980

Anda bisa menggunakan ini:

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

Atau, untuk versi yang lebih awal dari JDK 1.5, gunakan java.util.StringBuffersebagai ganti StringBuilder- mereka memiliki API yang sama. Terima kasih komentator untuk menunjukkan yang StringBuilderdisukai saat ini ketika tidak ada masalah konkurensi.

Daniel Brockman
sumber
13
"Terima kasih komentator untuk menunjukkan bahwa StringBuilder lebih disukai saat ini"? Ada pernyataan yang jelas bahwa StringBuffer jika keamanan-benang menjadi perhatian. jika tidak, StringBuilder dapat digunakan. StringBuilder bukan pengganti untuk StringBuffer.
ha9u63ar
15
@ ha9u63ar Untuk skenario ini dengan StringBuilderkonkurensi membuang-buang lokal tidak menjadi masalah (dan saya pikir itu yang dia maksud).
xehpuk
2
Berikut tautan untuk mengetahui perbedaan yang tepat antara keduanya: javatpoint.com/... singkatnya: StringBuilder lebih efisien daripada StringBuffer. Ini bukan utas aman yaitu beberapa utas sekaligus dapat memanggil metode StringBuilder.
Wisnu Narang
Ini tidak akan berfungsi untuk karakter Unicode di luar BMP, asalkan untuk menggabungkan karakter.
nau
2
@Daniel Brockman, Terima kasih atas jawaban Anda yang baik dan ringkas. Di sini OP berkata, "Hello World" disimpan dalam variabel String bernama hi . Itu artinya String hi = "Hello World";. Jadi saya pikir dalam jawaban Anda seharusnya tidak ada tanda kutip ganda hi. Maksud saya seharusnya seperti ininew StringBuilder(hi).reverse().toString()
Ny. Abu Nafee Ibna Zahid
109

Untuk masalah online Hakim yang tidak memungkinkan StringBuilderatau StringBuffer, Anda dapat melakukannya di tempat menggunakan char[]sebagai berikut:

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);
}
Sami Eltamawy
sumber
Hanya sebuah catatan. Ini akan gagal total untuk "karakter" yang menempati dua byte.
Minas Mina
Sebenarnya, ini biasanya berfungsi dengan baik untuk sebagian besar karakter yang menempati 2 byte. Apa yang sebenarnya gagal adalah Unicode codepoints yang menempati 2 x 16 bit codeunits (di UTF-16).
Stephen C
Ini adalah solusi yang baik, tetapi dapat kita lakukan untuk hal yang sama jika kita memiliki karakter 10k dalam string dengan kompleksitas minimum.
Jatinder Kumar
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

Kevin Bowersox
sumber
4
Solusi bagus (1+). Satu peningkatan - StringBuilder (karena java5) akan lebih cepat dari StringBuffer. Salam.
Michał Šrajer
31
Ini tidak akan berfungsi dalam kasus umum karena tidak memperhitungkan bahwa beberapa "karakter" di unicode diwakili oleh pasangan pengganti yaitu dua karakter Java, dan solusi ini menghasilkan pasangan dalam urutan yang salah. Metode kebalikan dari StringBuilder harus sesuai dengan JavaDoc
Ian Fairman
59
String string="whatever";
String reverse = new StringBuffer(string).reverse().toString();
System.out.println(reverse);
Luchian Grigore
sumber
7
Apa kerumitannya? O (N) atau lebih? N sama dengan panjang string.
Mukit09
O (n) karena harus beralih melalui karakter string setidaknya sekali.
PlsWork
26

Saya melakukan ini dengan menggunakan dua cara berikut:

Membalikkan string oleh KARAKTER:

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());    
}

Membalikkan string oleh KATA:

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);
}
Vikasdeep Singh
sumber
19

Lihatlah Java 6 API di bawah StringBuffer

String s = "sample";
String result = new StringBuffer(s).reverse().toString();
Andrew Briggs
sumber
apakah ini lebih baik dari StringBuilder?
CamHart
@CamHart Tidak, ini lebih lambat, tapi mungkin hanya sedikit.
jcsahnwaldt mengatakan GoFundMonica
1
Sebuah patokan kecil dengan hampir 100 juta pemanggilan metode menunjukkan perbedaan yang signifikan antara StringBuffer dan StringBuilder: stackoverflow.com/questions/355089/... Tetapi dalam kasus ini, hanya ada dua panggilan ( reverse()dan toString()), jadi perbedaannya mungkin bahkan tidak akan menjadi terukur.
jcsahnwaldt mengatakan GoFundMonica
17

Berikut ini contoh penggunaan rekursi:

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);
}
C0D3LIC1OU5
sumber
2
Sudah ada jawaban yang jauh lebih baik, terutama @ DanielBrockman's. Jika suatu algoritma sudah ada di perpustakaan standar, tidak perlu untuk membuatnya dan menemukan kembali roda.
Willi Mentzel
14
Konsep "jawaban yang jauh lebih baik" adalah subyektif. Ini mungkin persis apa yang dicari seseorang.
C0D3LIC1OU5
2
OP sudah menyatakan bahwa "ada semacam fungsi yang sudah ada di Jawa yang melakukan itu" jadi tujuannya adalah untuk mengetahui dengan tepat "fungsi" ini. Hanya memposting jawaban yang tidak ada hubungannya dengan pertanyaan aktual yang diajukan tidak masuk akal. Jika seseorang meminta implementasi kustom jawaban Anda akan dibenarkan, dalam hal ini tidak.
Willi Mentzel
Downvote. Sebagian besar solusi lain adalah O (n) dan dapat menangani string dengan panjang berapa pun, yang ini adalah O (n ^ 2) dan cenderung crash dengan StackOverflowError untuk string yang lebih panjang dari sekitar 5000 karakter (pada JDK 8 VM, konfigurasi default) .
jcsahnwaldt mengatakan GoFundMonica
1. Solusi lain tidak menggunakan rekursi dan dapat menangani string panjang dengan baik. Mengapa Anda menggunakan rekursi alih-alih iterasi untuk tugas seperti ini? Itu tidak masuk akal. (Kecuali jika Anda berasal dari latar belakang pemrograman fungsional, yang sering menyebabkan masalah ketika Anda menulis kode dalam bahasa imperatif / OO.) 2. Rangkaian string ('+' kecil yang tidak bersalah) adalah O (n). Anda harus baru ke Jawa, kalau tidak Anda akan tahu itu.
jcsahnwaldt mengatakan GoFundMonica
12

Berikut ini adalah solusi tingkat rendah:

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));
    }
}
Artur Grigio
sumber
12

Saya mencoba, hanya untuk bersenang-senang, dengan menggunakan Stack. Ini kode saya:

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

}
Enrico Giurin
sumber
11

Karena metode di bawah ini (menggunakan XOR ) untuk membalikkan string tidak terdaftar, saya melampirkan metode ini untuk membalikkan string.

The Algoritma ini didasarkan pada:

1. (A XOR B) XOR B = A

2. (A XOR B) XOR A = B

Cuplikan kode:

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]);
        }
    }

}

Keluaran:

keetarp

Prateek Joshi
sumber
8

Seperti yang telah ditunjukkan orang lain, cara yang disukai adalah menggunakan:

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

Tetapi jika Anda ingin menerapkan ini sendiri, saya takut bahwa sisa tanggapan memiliki kekurangan.

Alasannya adalah yang Stringmewakili daftar titik Unicode , dikodekan dalam char[]array sesuai dengan pengkodean panjang variabel: UTF-16 .

Ini berarti beberapa titik kode menggunakan elemen tunggal array (satu unit kode) tetapi yang lain menggunakan dua di antaranya, sehingga mungkin ada pasangan karakter yang harus diperlakukan sebagai satu unit (pengganti "tinggi" dan "rendah" berurutan) .

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"));
}
idelvall
sumber
Solusi bagus, hanya bagian yang hilang sekarang yang menangani penggabungan diakritik :-D
René
6

Ini sangat sederhana dalam kode baris minimum

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));
            }
    }
}
Neelendra
sumber
Saya akan menulis ini sekarang .. Anda sudah menulisnya!
Jency
4

Ini berhasil bagi saya

public static void main(String[] args) {

    String text = "abcdefghijklmnopqrstuvwxyz";

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

1. Menggunakan Array Karakter:

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. Menggunakan StringBuilder:

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

ATAU

return new StringBuilder(inputString).reverse().toString();
Avijit Karmakar
sumber
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);

Saya menggunakan metode ini untuk mengubah nama mundur dan menjadi huruf kecil.

Stormhawks
sumber
2
    public String reverse(String s) {

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

        return reversedString;
    }
Dom Shahbazi
sumber
Sekali lagi, pasangan pengganti akan menjadi rusak dengan cara ini.
HyperNeutrino
@JamesSmith, bisakah Anda memperluas ini?
Dom Shahbazi
1
Beberapa karakter unicode terdiri dari dua karakter; jika keduanya diaktifkan, string rusak. Juga, satu kesalahan yang sering diabaikan adalah regex.
HyperNeutrino
2

Salah satu cara alami untuk membalikkan Stringadalah dengan menggunakan StringTokenizerdan tumpukan. Stackadalah kelas yang mengimplementasikan tumpukan objek terakhir-masuk, pertama-keluar (LIFO) yang mudah digunakan.

String s = "Hello My name is Sufiyan";

Masukkan ke dalam tumpukan ke depan

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

Cetak tumpukan ke belakang

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

System.out.println('"');
Sufiyan Ghori
sumber
2
public class Test {

public static void main(String args[]) {
   StringBuffer buffer = new StringBuffer("Game Plan");
   buffer.reverse();
   System.out.println(buffer);
 }  
}
Joby Wilson Mathews
sumber
Ini tidak menjawab pertanyaan.
Ryan
2

Semua solusi di atas terlalu bagus tetapi di sini saya membuat string terbalik menggunakan pemrograman rekursif.

Ini bermanfaat bagi mereka yang mencari cara rekursif dalam melakukan string terbalik.

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

}

}
Dhiral Pandya
sumber
2

Prosedur:

Kita dapat menggunakan split () untuk membagi string. Kemudian gunakan loop terbalik dan tambahkan karakter.


Cuplikan kode:

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

ruam
sumber
1

reverse String publik (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);

}
rvd
sumber
1

Anda juga dapat mencoba ini:

public class StringReverse {
    public static void main(String[] args) {
        String str = "Dogs hates cats";
        StringBuffer sb = new StringBuffer(str);
        System.out.println(sb.reverse());
    }
}
Anurag Goel
sumber
1
ada banyak metode untuk membalikkan string. Ini adalah salah satu dari mereka menggunakan kelas stringbuffer dari java. Jawaban yang diterima menggunakan kelas diff untuk membalikkan yang tidak tersedia dalam versi JDK yang lebih lama.
Anurag Goel
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){
  }
Deepak Singh
sumber
1

pengulangan:

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

Hanya untuk bersenang-senang..:)

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

Lintasi i dari 0 hingga len / 2 lalu

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

Kompleksitas Waktu: O (n)

Kompleksitas Ruang: 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);
    }

}
jatin Goyal
sumber
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;
}
Muhammad Aasharib Nawshad
sumber
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(); 

    }
Mutlu
sumber
Ini hanya menghasilkan karakter dari string satu per satu. Dan juga tidak dapat digunakan di mana pun dalam program ini. Jauh lebih baik untuk membuat variabel String, masukkan "char" satu per satu ke dalam string, lalu kembalikan string.
Zombie Chibi 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.
abhi
sumber
@Dharman terima kasih atas jawabannya. menambahkan penjelasan dan satu lagi solusi.
abhi
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);

}

}
kumaravel j
sumber
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);        
    }
}

Jika Anda ingin menggunakan loop sederhana!

Apetrei Ionut
sumber