java输入一串字符串反转_反转Java中的字符串

java输入一串字符串反转

Reverse a String in java is a good coding related interview question. I have seen interviewee trying many ways to reverse a String using different ways. The idea of this post is to provide some of the popular ways to reverse a String and finally determine which is the best and correct way to reverse a string.

在Java中反转字符串是一个很好的与编码相关的面试问题。 我看到受访者尝试了多种方法来使用不同的方法来反转字符串。 这篇文章的想法是提供一些反转字符串的流行方法,并最终确定哪种是反转字符串的最佳和正确方法。

反转Java中的字符串 (Reverse a String in Java)

Reverse a String in Java

Here are some of the popular ways that are found online to reverse a string in java program. Note that there is no reverse method in String, otherwise we could have avoided all these workaround methods.


以下是一些在线查找Java程序中的字符串的流行方法。 请注意,String中没有reverse方法,否则我们可以避免所有这些变通方法。

  1. 使用StringBuilder或StringBuffer反转字符串 (Reverse String using StringBuilder or StringBuffer)

    We know that StringBuffer and StringBuilder classes provide reverse method, so we can use that to reverse a string. Below is the code snippet showing how to use StringBuilder to reverse a string.

    String input = "java";
    StringBuilder sb = new StringBuilder(input);
    String result = sb.reverse().toString();
    System.out.println(result); //prints 'avaj'

    我们知道StringBufferStringBuilder类提供了reverse方法,因此我们可以使用它来反向字符串。 以下是显示如何使用StringBuilder反转字符串的代码段。

  2. 使用字符数组的反向字符串 (Reverse String using Char Array)

    We can convert String to char array and then traverse it in reverse direction and populate a second char array from it. Then use the second char array to create the string that will be reversed of the first one. Below is the code for this approach.

    String input = "java";
    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(new String(result));

    我们可以将String转换为char数组 ,然后以相反的方向遍历它,并从中填充第二个char数组。 然后使用第二个char数组创建将与第一个相反的字符串。 下面是此方法的代码。

  3. 使用字节数组反转字符串 (Reverse String using Byte Array)

    Same approach as with char array, but using byte array. Code is shown below.

    String input = "java";
    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(new String(result));

    与char数组相同的方法,但使用字节数组。 代码如下所示。

逐字反串 (Reverse String Word by Word)

Sometimes we want words to be reversed in a sentence, not char by char. Below is a simple code showing how to do it using String split function and StringBuilder.

有时我们希望单词在句子中被颠倒,而不是一个字符一个字符地反转。 下面是一个简单的代码,显示了如何使用String split函数和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中反转String的最佳方法? (Best way to reverse String in Java?)

So from above three approaches, which is the correct and best one. As you can see above that all the three approaches works fine for the simple given input. If you read the String class javadoc, it has some interesting points.

因此,从以上三种方法来看,这是正确和最佳的方法。 正如您在上面看到的那样,这三种方法对于简单的给定输入都可以正常工作。 如果您阅读String类javadoc,那么它有一些有趣的地方。

The String class provides methods for dealing with Unicode code points (i.e., characters), in addition to those for dealing with Unicode code units (i.e., char values).

除了用于处理Unicode代码单元(即,char值)的方法外,String类还提供用于处理Unicode代码点(即,字符)的方法。

So it seems that for some unicode characters, it will take two index positions in the char array or byte array. Will it have any effect on the code we have seen above to reverse the String. Let’s find out by writing a simple class where we will take user input using Scanner class and reverse it by using all the three methods above.

因此,对于某些unicode字符而言,它将在char数组或字节数组中占据两个索引位置。 它对我们上面看到的反转String的代码有影响吗? 让我们通过编写一个简单的类进行查找,在该类中,我们将使用Scanner类接收用户输入,并通过使用上述所有三种方法来反转它。

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() + "'");

	}

}

Below is a sample output for one of the test run.

以下是其中一个测试运行的示例输出。

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'

So it seems all the methods are working fine for normal english characters based String. Now below image shows another run where unicode characters are present in the input string.

因此,似乎所有方法对于基于String的普通英语字符都可以正常工作。 现在下图显示了另一个运行,其中输入字符串中存在Unicode字符。

So in above scenario, byte array reverse didn’t worked properly. However StringBuilder and char array approach worked fine. I haven’t tried with supplement characters as input string for above program, but if I look at the javadoc for StringBuilder reverse function API, it says:

因此,在上述情况下,字节数组反向无法正常工作。 但是,StringBuilder和char数组方法可以正常工作。 我没有尝试使用补充字符作为上述程序的输入字符串,但是如果我查看StringBuilder反向函数API的javadoc,它会说:

Causes this character sequence to be replaced by the reverse of the sequence. If there are any surrogate pairs included in the sequence, these are treated as single characters for the reverse operation. Thus, the order of the high-low surrogates is never reversed. Let n be the character length of this character sequence (not the length in char values) just prior to execution of the reverse method. Then the character at index k in the new character sequence is equal to the character at index n-k-1 in the old character sequence.
使此字符序列被序列的相反字符替换。 如果序列中包含任何代理对,则将它们视为反向操作的单个字符。 因此,从高到低的替代物的顺序永远不会颠倒。 令n为恰好执行反向方法之前此字符序列的字符长度(而不是char值中的长度)。 然后,新字符序列中索引k处的字符等于旧字符序列中索引nk-1中的字符。

So it seems supplement characters are being taken care of in StringBuilder reverse() method. That’s why if there is any need to reverse a string, my recommendation is to use StringBuilder reverse() method.

因此,似乎在StringBuilder reverse()方法中已处理了补字符。 这就是为什么如果需要反转字符串,我的建议是使用StringBuilder reverse()方法。

翻译自: https://www.journaldev.com/18310/reverse-a-string-in-java

java输入一串字符串反转

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值