Java'da bir dizeyi ters çevirme


467

Ben var "Hello World"adında bir dize değişkeninde tutulur hi.

Yazdırmam gerekiyor, ama tersine çeviriyorum.

Bunu nasıl yapabilirim? Bunu zaten Java'da yerleşik olan bir tür fonksiyon olduğunu anlıyorum.

İlgili: “Hello World” dizesinin her bir sözcüğünü Java ile ters çevirin


7
@JRL gerçekten String olmalıdır = "dlroW olleH"; System.out.println (ih);
Matthew Farwell

4
Keşke yakın oyumu geri çekebilseydim (kopya olarak). Diğer soruyu tekrar okudum ve bunun bundan daha farklı olduğunu fark ettim. Bununla birlikte, bu soru site genelinde hala birçok kez tekrarlanmaktadır. Muhtemelen bunu bir dupe olarak işaretlemek için farklı bir soru bulmalıyız.
Rob Hruska

StringBuilder sınıfının reverse () işlevini, toCharArray () yöntemini, karakterleri değiştirmeyi ve çok daha fazlasını kullanabilirsiniz. daha fazla örnek için bu kaynağa bakın, flowerbrackets.com/2-best-ways-to-reverse-a-string-in-java
Shiva

StringBuilder.reverse () daha okunabilir ve elegent bir çözümdür.
lokesh

Yanıtlar:


981

Bunu kullanabilirsiniz:

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

Ya da, daha önce JDK 1.5 den sürümleri için kullanmak java.util.StringBufferyerine, StringBuilder- Aynı API vardır. StringBuilderBugünlerde eşzamanlılık sorunu olmadığında tercih edildiğine dikkat çeken yorumcular .


13
"Bugünlerde StringBuilder'ın tercih edildiğine dikkat çeken yorumcular"? İş parçacığı güvenliği bir endişe varsa, StringBuffer açık bir ifade vardır. aksi takdirde StringBuilder kullanılabilir. StringBuilder, StringBuffer'ın yerini almaz.
ha9u63ar

15
@ ha9u63ar Yerel bir ıskarta StringBuildereşzamanlılığı olan bu senaryo için bir endişe değildir (ve bence bu demekti).
xehpuk

2
İkisi arasındaki tam farkı bilmek için bağlantı: kısaca javatpoint.com/… : StringBuilder, StringBuffer'dan daha verimlidir . İş parçacığı güvenli değil yani birden çok iş parçacığı aynı anda StringBuilder yöntemlerini çağırabilir.
Vishnu Narang

Bu, karakterler birleştirildiği sürece BMP dışındaki Unicode karakterler için çalışmaz.
nau

2
@Daniel Brockman, Güzel ve özlü cevabınız için teşekkür ederim. Burada OP dedi, "Merhaba Dünya" hi adlı bir String değişkeni tuttu . Bu demektir String hi = "Hello World";. Cevabını düşünmek Yani orada olmalı değil etrafında herhangi çift tırnak olmak hi. Yani böyle olmalınew StringBuilder(hi).reverse().toString()
Md. Abu Nafee Ibna Zahid

109

İçin Çevrimiçi Hakimler problemler izin vermez StringBuilderya StringBuffer, bunu yapabilirsiniz yerinde kullanarak char[]aşağıdaki gibidir:

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

Sadece bir not olsa. Bu iki bayt işgal "karakterler" için korkunç başarısız olur.
Minas Mina

Aslında, 2 baytlık çoğu karakter için genellikle iyi çalışır. Aslında başarısız olan, 2 x 16 bit kod birimlerini (UTF-16'da) işgal eden Unicode kod noktalarıdır.
Stephen C

Bu iyi bir çözümdür, ancak dizide minimum karmaşıklığa sahip 10 bin karakter varsa aynı şeyi yapabiliriz.
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


4
İyi çözüm (1+). Bir geliştirme - StringBuilder (java5'ten beri) StringBuffer'dan daha hızlı olacaktır. Saygılarımızla.
Michał Šrajer

31
Bu, genel durumda çalışmaz çünkü unicode'daki bazı "karakterlerin" bir yedek çiftle, ​​yani iki Java karakteriyle temsil edildiğini dikkate almaz ve bu çözüm, çiftin yanlış sırada olmasını sağlar. StringBuilder'ın ters yöntemi JavaDoc'a
Ian Fairman

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

7
Bunun karmaşıklığı nedir? O (N) veya daha fazlası? N, dizenin uzunluğuna eşittir.
Mukit09

O (n) dize karakterlerini en az bir kez yinelemesi gerektiğinden.
PlsWork

26

Bunu aşağıdaki iki yolu kullanarak yapıyorum:

CHARACTERS tarafından ters dize:

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

Dizeyi WORDS ile ters çevir:

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

StringBuffer altındaki Java 6 API'sına göz atın

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

Bu StringBuilder daha iyidir?
CamHart

@CamHart Hayır, daha yavaş, ama muhtemelen sadece küçük bir parça.
jcsahnwaldt, GoFundMonica

1
Neredeyse 100 milyon yöntem çağrısı ile küçük bir kıyaslama StringBuffer ve StringBuilder arasında önemli bir fark gösterdi: stackoverflow.com/questions/355089/… Ancak bu durumda, sadece iki çağrı ( reverse()ve toString()) var, bu yüzden fark muhtemelen olmayacak bile ölçülebilir.
jcsahnwaldt diyor GoFundMonica

17

Özyineleme kullanan bir örnek:

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
Zaten çok daha iyi cevaplar var, özellikle @ DanielBrockman. Standart bir kitaplıkta zaten bir algoritma varsa, onu işlemeye ve tekerleği yeniden keşfetmeye gerek yoktur.
Willi Mentzel

14
"Çok daha iyi cevap" kavramı özneldir. Bu tam olarak birisinin aradığı şey olabilir.
C0D3LIC1OU5

2
OP zaten "Java'da zaten yerleşik olan bir tür fonksiyon var" dedi. Sadece sorulan asıl soru ile ilgisi olmayan bir cevap göndermek mantıksızdır. Birisi özel bir uygulama isteyecek olsaydı, cevabınız haklı olurdu, bu durumda değil.
Willi Mentzel

Downvote. Diğer çözümlerin çoğu O (n) 'dir ve hemen hemen her uzunlukta dizeleri işleyebilir, bu O (n ^ 2) ve yaklaşık 5000 karakterden uzun dizeler için StackOverflowError ile çökme eğilimindedir (JDK 8 VM'de, varsayılan yapılandırma) .
jcsahnwaldt, GoFundMonica

1. Diğer çözümler özyineleme kullanmaz ve uzun dizeleri iyi işleyebilir. Böyle bir görev için neden yineleme yerine yineleme kullanasınız? Hiç bir anlamı yok. (İşlevsel bir programlama arka planından gelmediğiniz sürece, zorunlu bir / OO dilinde kod yazarken sorunlara yol açar.) 2. Dize birleştirme (bu masum küçük '+') O (n) 'dir. Java için yeni olmalısınız, aksi halde bunu bilirsiniz.
jcsahnwaldt, GoFundMonica

12

İşte düşük seviyeli bir çözüm:

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

Sadece eğlenmek için bir Stack kullanarak denedim. İşte benim kod:

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

Bir dizeyi tersine çevirmek için aşağıdaki yöntem ( XOR kullanarak ) listelenmediğinden, bir dizeyi tersine çevirmek için bu yöntemi ekliyorum.

Algoritma dayanmaktadır:

1. (A XOR B) XOR B = A

2. (A XOR B) XOR A = B

Kod snippet'i:

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

}

Çıktı:

keetarp


8

Diğerlerinin işaret ettiği gibi, tercih edilen yol kullanmaktır:

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

Ancak bunu kendiniz uygulamak istiyorsanız, geri kalan cevapların kusurları olduğundan korkuyorum.

Bunun nedeni, değişken uzunluklu kodlamaya göre bir dizide kodlanan Unicode noktalarının Stringbir listesini temsil etmesidir: UTF-16 .char[]

Bu, bazı kod noktalarının dizinin tek bir öğesini (bir kod birimi) kullandıkları, ancak diğerlerinin ikisini kullandıkları anlamına gelir, bu nedenle tek bir birim (ardışık "yüksek" ve "düşük" taşıyıcılar) olarak ele alınması gereken karakter çiftleri olabilir .

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

İyi bir çözüm, sadece bir kısmı eksik diakritik kombinasyonları ele alıyor:
René

6

Minimum satır kodunda çok basit

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

Bunu şimdi yazacaktım ... Zaten yazmışsın buldun!
Jency

4

Bu benim için hile yaptı

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. Karakter Dizisini Kullanma:

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 kullanarak:

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

VEYA

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

İsimleri geriye ve küçük harfe dönüştürmek için bu yöntemi kullandım.


2
    public String reverse(String s) {

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

        return reversedString;
    }

Yine, vekil çiftler bu şekilde bozulacaktır.
HyperNeutrino

@JamesSmith bunu genişletebilir misiniz lütfen?
Dom Shahbazi

1
Bazı unicode karakterler iki karakterden oluşur; bu ikisi değiştirilirse, dize bozuktur. Ayrıca, genel olarak gözden kaçan bir hata regex'tir.
HyperNeutrino

2

A'yı tersine çevirmenin doğal bir yolu, Stringa StringTokenizerve yığın kullanmaktır. Stackkullanımı kolay son giren ilk çıkar (LIFO) nesne yığınını uygulayan bir sınıftır.

String s = "Hello My name is Sufiyan";

Yığına öne doğru koy

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

Yığını geriye doğru yazdırın

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 Test {

public static void main(String args[]) {
   StringBuffer buffer = new StringBuffer("Game Plan");
   buffer.reverse();
   System.out.println(buffer);
 }  
}

Bu soruya cevap vermiyor.
Ryan

2

Yukarıdaki tüm çözüm çok iyi ama burada özyinelemeli programlama kullanarak ters dize yapıyorum.

Bu, ters dize yapmanın özyinelemeli yolunu arayanlar için yararlıdır.

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

Prosedür:

Dizeyi bölmek için split () öğesini kullanabiliriz.


Kod snippet'i:

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 (Dize) {

    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

Bunu da deneyebilirsiniz:

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
bir dize tersine çevirmek için birçok yöntem vardır. bu onlardan biri java stringbuffer sınıfını kullanarak. kabul cevap tersine JDK eski sürümünde bulunmayan diff sınıfı kullanıyor.
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){
  }

1

özyineleme:

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

1

Sadece eğlence için..:)

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

İ'yi 0'dan len / 2'ye geçirin ve sonra

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

Zaman Karmaşıklığı: O (n)

Alan Karmaşıklığı: 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(); 

    }

Bu, dizenin karakterlerini tek tek çıktılar. Ayrıca programın hiçbir yerinde kullanılamaz. Bir String değişkeni oluşturmak, "char" ı dizeye tek tek eklemek ve daha sonra dizeyi döndürmek çok daha iyidir.
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.

@ Harman cevap için teşekkürler. açıklama ve bir çözüm daha ekledi.
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);

}

}

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

Eğer döngü için basit kullanmak istiyorsanız!

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.