java实现字符串反转

问题:

给一个字符串,比如 “I love china”, 把字符反转后变成 “china love I”

思路:

先把字符串从第一个字符与最后一个字符对换,第二个字符和倒数第二个字符对换,这样,我们就把每一个单词位置互换了。但是我们要求单词里面字符的顺序是不能变的,所以,我们要把每一个单词里面的字符从头到尾对换一下。这样就可以得到我们想要的字符串了。

实现:

因为这里两次都会用到字符反转,所以我们就单独写一个swap的方法出来。我们对每个单词进行发转的时候,需要记录每个单词的起始点和结束点,对于第一个单词,起始点是0,最后一个单词,结束点是string.length() - 1。而中间的单词,开始点和结束点是空格的位置。

代码如下:

public class StringReverse {
	
	public void swap(char[] arr, int begin, int end) {
		while(begin < end) {
			char temp = arr[begin];
			arr[begin] = arr[end];
			arr[end] = temp;
			begin++;
			end--;
		}
	}
	
	public String swapWords(String str) {
		char[] arr = str.toCharArray();
		swap(arr, 0, arr.length - 1);
		int begin = 0;
		for (int i = 1; i < arr.length; i++) {
			if (arr[i] == ' ') {
				swap(arr, begin, i - 1);
				begin = i + 1;
			}
		}
		swap(arr, begin, arr.length - 1);
		return new String(arr);
	}
	
	public static void main(String[] args) {
		String str = "I";
		System.out.println(new StringReverse().swapWords(str));
	}

}

转载请注明出处:http://blog.youkuaiyun.com/beiyeqingteng

### Java实现字符串反转的方法 Java中可以通过多种方式实现字符串反转。以下是几种常见的方法及其代码示例: #### 方法一:使用 `StringBuilder` 的 `reverse()` 方法 `StringBuilder` 是一个可变的字符序列,其内置的 `reverse()` 方法可以直接用于反转字符串。 ```java public class ReverseStringExample { public static void main(String[] args) { String original = "Hello, World!"; StringBuilder sb = new StringBuilder(original); String reversed = sb.reverse().toString(); System.out.println(reversed); // 输出: "!dlroW ,olleH" } } ``` 这种方法简单且高效[^1]。 #### 方法二:使用 `StringBuffer` 的 `reverse()` 方法 与 `StringBuilder` 类似,`StringBuffer` 也提供了一个 `reverse()` 方法,但它是线程安全的,因此在多线程环境下可能更适用。 ```java public class ReverseStringExample { public static void main(String[] args) { String string = "Hello, World!"; String reverse = new StringBuffer(string).reverse().toString(); System.out.println("字符串反转前:" + string); System.out.println("字符串反转后:" + reverse); } } ``` 虽然 `StringBuffer` 是线程安全的,但在单线程环境中,它的性能通常略低于 `StringBuilder`[^3]。 #### 方法三:使用字符数组 通过将字符串转换为字符数组并逐个交换字符位置,可以手动实现字符串反转。 ```java public class ReverseStringExample { public static void main(String[] args) { String original = "Hello, World!"; char[] charArray = original.toCharArray(); int left = 0; int right = charArray.length - 1; while (left < right) { // 交换左右字符 char temp = charArray[left]; charArray[left] = charArray[right]; charArray[right] = temp; left++; right--; } String reversed = new String(charArray); System.out.println(reversed); // 输出: "!dlroW ,olleH" } } ``` 这种方法不依赖于内置方法,适合需要自定义逻辑的场景[^2]。 #### 方法四:使用递归 递归是一种优雅但可能效率较低的方法,适用于学习和理解递归机制。 ```java public class ReverseStringExample { public static String reverse(String str) { if (str == null || str.length() <= 1) { return str; } return reverse(str.substring(1)) + str.charAt(0); } public static void main(String[] args) { String original = "Hello, World!"; String reversed = reverse(original); System.out.println(reversed); // 输出: "!dlroW ,olleH" } } ``` 递归方法的性能取决于字符串长度,过长可能导致栈溢出。 #### 方法五:使用 Apache Commons Lang 库 Apache Commons Lang 提供了 `StringUtils.reverse()` 方法,可以方便地实现字符串反转。 ```java import org.apache.commons.lang3.StringUtils; public class ReverseStringExample { public static void main(String[] args) { String original = "Hello, World!"; System.out.println(StringUtils.reverse(original)); // 输出: "!dlroW ,olleH" } } ``` 此方法需要引入外部库,但对于已有项目来说非常便捷。 #### 方法六:使用 Java 8 的 Stream API 尽管不是最优解,但可以通过 Stream API 实现字符串反转。 ```java public class ReverseStringExample { public static void main(String[] args) { String original = "Hello, World!"; String reversed = new StringBuilder( original.chars() .mapToObj(c -> (char) c) .collect(Collectors.toList()) .stream() .reduce("", (s, c) -> c + s, String::concat)) .toString(); System.out.println(reversed); // 输出: "!dlroW ,olleH" } } ``` 这种方法主要用于展示 Stream API 的灵活性,但在性能上不如其他方法[^1]。 --- ### 性能对比 - `StringBuilder` 和 `StringBuffer` 的 `reverse()` 方法性能相当,但 `StringBuilder` 更快,因为它不是线程安全的[^3]。 - 字符数组方法和递归方法的性能取决于实现细节,通常字符数组方法更快。 - 使用外部库如 Apache Commons Lang 可以简化代码,但会增加项目的依赖[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值