我有“Hello World”保存在一个名为hi的字符串变量中。
我需要打印出来,但要颠倒过来。
我该怎么做呢?我知道Java中已经内置了这样一个函数。
相关:用Java反向“Hello World”字符串的每一个单词
我有“Hello World”保存在一个名为hi的字符串变量中。
我需要打印出来,但要颠倒过来。
我该怎么做呢?我知道Java中已经内置了这样一个函数。
相关:用Java反向“Hello World”字符串的每一个单词
当前回答
简单的回答是,由于“代理对”问题,Java没有提供反转String的通用解决方案,您必须考虑到这个问题。
如果要求保证它适用于所有Unicode和所有语言(包括Welsh:),那么您必须自己编写。只需将字符串作为代码点进行就地数组交换:
public static String reverse(String str)
{
// You get what you ask for ;)
if (str == null) return null;
// str.length() is equal to the number of unicode code points in a string
if (str.isEmpty() || str.length() == 1) return str;
final int[] codePoints = str.codePoints().toArray();
final int len = codePoints.length;
// swap in place
for(int i = 0; i < codePoints.length/2; i++)
{
int tmp = codePoints[i];
codePoints[i] = codePoints[len-i-1];
codePoints[len-i-1] = tmp;
}
return new String(codePoints,0,len);
}
如果您通过使用String.getBytes()来做到这一点,那么所有的字节都将被反转,这将反转所有的UTF-8编码,并且任何使用不是int编码点的字符的尝试都将失败,任何“星体平面”编码点(BMP之外的那些)。
作为一个通解,这是相当有效的,但它非常简单,并保证适用于任何字符串,这可能是你想要的“通解”。
唯一的问题是,如果你从UTF8/16编码文件中读取字符串,你可能在开始时有一个BOM,但这超出了问题的范围。
蓝
其他回答
反转字符串有很多种方法。
1. 将字符串转换为字节:getBytes()方法用于将输入字符串转换为字节[]。
import java.lang.*;
import java.io.*;
import java.util.*;
class ReverseString{
public static void main(String[] args)
{
String input = "GeeksforGeeks";
byte [] strAsByteArray = input.getBytes();
byte [] result = new byte [strAsByteArray.length];
for (int i = 0; i<strAsByteArray.length; i++)
result[i] =
strAsByteArray[strAsByteArray.length-i-1];
System.out.println(new String(result));
}
}
2.将字符串转换为字符数组:用户输入需要反转的字符串。(个人建议)
import java.lang.*;
import java.io.*;
import java.util.*;
class ReverseString{
public static void main(String[] args)
{
String input = "GeeksForGeeks";
// convert String to character array
// by using toCharArray
char[] try1 = input.toCharArray();
for (int i = try1.length-1; i>=0; i--)
System.out.print(try1[i]);
}
}
3.使用ArrayList对象:使用toCharArray()内置方法将输入字符串转换为字符数组。然后,将数组的字符添加到ArrayList对象中。Java还为Collections类内置了reverse()方法。由于Collections类reverse()方法接受一个列表对象,为了反转列表,我们将传递LinkedList对象,这是一种字符列表类型。
import java.lang.*;
import java.io.*;
import java.util.*;
class ReverseString{
public static void main(String[] args)
{
String input = "Geeks For Geeks";
char[] hello = input.toCharArray();
List<Character> trial1 = new ArrayList<>();
for (char c: hello)
trial1.add(c);
Collections.reverse(trial1);
ListIterator li = trial1.listIterator();
while (li.hasNext())
System.out.print(li.next());
}
}
递归:
public String stringReverse(String string) {
if (string == null || string.length() == 0) {
return string;
}
return stringReverse(string.substring(1)) + string.charAt(0);
}
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;
}
简单的回答是,由于“代理对”问题,Java没有提供反转String的通用解决方案,您必须考虑到这个问题。
如果要求保证它适用于所有Unicode和所有语言(包括Welsh:),那么您必须自己编写。只需将字符串作为代码点进行就地数组交换:
public static String reverse(String str)
{
// You get what you ask for ;)
if (str == null) return null;
// str.length() is equal to the number of unicode code points in a string
if (str.isEmpty() || str.length() == 1) return str;
final int[] codePoints = str.codePoints().toArray();
final int len = codePoints.length;
// swap in place
for(int i = 0; i < codePoints.length/2; i++)
{
int tmp = codePoints[i];
codePoints[i] = codePoints[len-i-1];
codePoints[len-i-1] = tmp;
}
return new String(codePoints,0,len);
}
如果您通过使用String.getBytes()来做到这一点,那么所有的字节都将被反转,这将反转所有的UTF-8编码,并且任何使用不是int编码点的字符的尝试都将失败,任何“星体平面”编码点(BMP之外的那些)。
作为一个通解,这是相当有效的,但它非常简单,并保证适用于任何字符串,这可能是你想要的“通解”。
唯一的问题是,如果你从UTF8/16编码文件中读取字符串,你可能在开始时有一个BOM,但这超出了问题的范围。
蓝
看一下StringBuffer下的Java 6 API
String s = "sample";
String result = new StringBuffer(s).reverse().toString();