Java에서 문자열 반전


467

나는 한 "Hello World"라는 문자열 변수에 보관 hi.

인쇄해야하지만 그 반대입니다.

어떻게해야합니까? Java에 이미 내장 된 기능이 있다는 것을 알고 있습니다.

관련 : "Hello World"문자열의 각 개별 단어를 Java로 반전


7
@JRL은 실제로 String이어야합니다. ih = "dlroW olleH"; System.out.println (ih);
Matthew Farwell

4
가까운 투표를 취소 할 수 있기를 바랍니다 (중복). 나는 다른 질문을 다시 읽고 이것이 미묘하게 다르다는 것을 깨달았습니다. 그러나이 질문은 여전히 ​​사이트 전체에 걸쳐 여러 번 반복됩니다. 아마 이것을 속임수로 표시하기 위해 다른 질문을 찾아야 할 것입니다.
Rob Hruska

StringBuilder 클래스의 reverse () 함수, toCharArray () 메서드, 문자 교체 등을 사용할 수 있습니다. 예를 들어 flowerbrackets.com/2-best-ways-to-reverse-a-string-in-java에
Shiva

StringBuilder.reverse () 는 더 읽기 쉽고 효과적인 솔루션입니다.
lokesh

답변:


980

이것을 사용할 수 있습니다 :

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

또는 JDK 1.5 이전 버전의 경우 동일한 API를 사용하는 java.util.StringBuffer대신 사용 StringBuilder하십시오. StringBuilder동시성에 대한 우려가없는 오늘날 선호되는 점에 대해 감사의 말을 전 합니다.


13
"현재 StringBuilder가 선호된다고 지적한 해설자들에게 감사합니다"? 스레드 안전성이 우려되는 경우 StringBuffer라는 명확한 설명이 있습니다. 그렇지 않으면 StringBuilder를 사용할 수 있습니다. StringBuilder는 StringBuffer를 대체하지 않습니다.
ha9u63ar

15
@ ha9u63ar이 시나리오에서는 로컬 이탈 StringBuilder성 동시성이 문제가되지 않습니다 (그가 생각했던 것 같습니다).
xehpuk

2
다음은 javatpoint.com/… 의 정확한 차이점을 알 수있는 링크입니다 . StringBuilder는 StringBuffer 보다 효율적 입니다. 스레드 안전하지 않습니다. 즉, 여러 스레드가 동시에 StringBuilder의 메서드를 호출 할 수 있습니다.
비슈누 나랑

문자를 결합하는 한 BMP 외부의 유니 코드 문자에는 작동하지 않습니다.
nau

2
@Daniel Brockman, 훌륭하고 간결한 답변 감사합니다. 여기서 OP 는 "Hello World"가 hi라는 문자열 변수에 보관되어 있다고 말했습니다 . 그것은 의미 String hi = "Hello World";합니다. 나는 당신의 대답에 생각 그래서이해야 하지 주위에 어떤 따옴표 수 hi. 나는 이런 식으로해야 의미new StringBuilder(hi).reverse().toString()
. 메릴랜드 아부 Nafee Ibna 자히드

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 바이트를 차지하는 "문자"에 대해서는 끔찍하게 실패합니다.
Minas Mina

실제로, 그것은 일반적으로 2 바이트를 차지하는 대부분의 문자에 대해 잘 작동합니다. 실제로 실패한 것은 2 x 16 비트 코드 단위 (UTF-16)를 차지하는 유니 코드 코드 포인트입니다.
Stephen C

이것은 좋은 해결책이지만 최소한의 복잡성을 가진 문자열에 10k 개의 문자가 있으면 동일한 작업을 수행 할 수 있습니다.
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
좋은 해결책 (1+). 한 가지 개선 사항-StringBuilder (java5부터)는 StringBuffer보다 빠릅니다. 문안 인사.
Michał Šrajer

31
유니 코드의 일부 "문자"는 서로 게이트 쌍 (예 : 두 개의 Java 문자)으로 표시되므로이 경우 쌍의 순서가 잘못됨을 고려하지 않으므로 일반적인 경우에는 작동하지 않습니다. StringBuilder의 리버스 메소드는 JavaDoc에 따라 양호해야합니다. docs.oracle.com/javase/7/docs/api/java/lang/…
Ian 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());    
}

WORDS로 문자열 뒤집기 :

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에서 Java 6 API를 살펴보십시오.

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

이것이 StringBuilder보다 낫습니까?
CamHart

@CamHart 아니요, 속도는 느리지 만 약간만있을 것입니다.
jcsahnwaldt는 GoFundMonica

1
: 거의 1 억 메소드 호출 함께 작은 벤치 마크의 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의 답변이 훨씬 좋습니다. 알고리즘이 표준 라이브러리에 이미 존재하는 경우 수작업으로 제작하고 휠을 다시 만들 필요가 없습니다.
Willi Mentzel

14
"더 나은 답변"개념은 주관적입니다. 이것은 누군가가 원하는 것입니다.
C0D3LIC1OU5

2
OP는 이미 "이미 Java에 내장 된 기능이있다"고 밝혔다. 따라서 그의 목표는 이것이 어떤 "기능"인지 정확히 아는 것이었다. 실제 질문과 거의 관련이없는 답변을 게시하는 것은 의미가 없습니다. 누군가가 맞춤형 구현을 요청했다면 귀하의 답변은 정당화 될 것입니다.이 경우에는 그렇지 않습니다.
Willi Mentzel

공감. 대부분의 다른 솔루션은 O (n)이며 거의 모든 길이의 문자열을 처리 할 수 ​​있습니다. 이것은 O (n ^ 2)이며 약 5000 자보다 긴 문자열에 대해 StackOverflowError와 충돌하는 경향이 있습니다 (JDK 8 VM, 기본 구성) .
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

나는 단지 재미를 위해 Stack을 사용하여 시도했다. 여기 내 코드 :

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

}

산출:

키 타프


8

다른 사람들이 지적한 것처럼 선호하는 방법은 다음을 사용하는 것입니다.

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

그러나 직접 구현하려는 경우 나머지 응답에 결함이 있음을 두려워합니다.

그 이유는 가변 길이 인코딩 UTF-16 에 따라 배열로 인코딩 된 유니 코드 포인트 String목록 을 나타냅니다 .char[]

즉, 일부 코드 포인트는 배열의 단일 요소 (하나의 코드 단위)를 사용하지만 다른 코드 포인트는 두 가지를 사용하므로 단일 단위로 취급해야하는 문자 쌍이있을 수 있습니다 (연속적인 "높음"및 "낮음"대리) .

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
René

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

나는 지금 이것을 쓸 예정였다. 당신은 이미 그것을 쓴 것을 발견했다!
Jency

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 당신은 이것을 확장 할 수 있습니까?
Dom Shahbazi 2016 년

1
일부 유니 코드 문자는 두 문자로 구성됩니다. 이 둘이 바뀌면 문자열이 손상됩니다. 또한 일반적으로 간과되는 오류 중 하나는 정규식입니다.
HyperNeutrino 2016 년

2

a를 뒤집는 자연스러운 방법 중 하나 String는 a StringTokenizer와 스택 을 사용하는 것 입니다. Stack사용하기 쉬운 LIFO (Last-In, First-Out) 객체 스택을 구현하는 클래스입니다.

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

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

이것은 질문에 대답하지 않습니다.
Ryan

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

공개 문자열 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
문자열을 반전시키는 많은 방법이 있습니다. 이것은 java.의 stringbuffer 클래스를 사용하는 방법 중 하나입니다. 허용 된 대답은 이전 버전의 JDK에서는 사용할 수없는 diff 클래스를 사용하여 되돌립니다.
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

재귀 :

 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]

i를 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.

@Dharman은 답변 주셔서 감사합니다. 설명과 하나 이상의 솔루션을 추가했습니다.
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);        
    }
}

간단한 for 루프를 사용하려면!

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.