我正试图扭转字符串中的单词。如果输入是
The quick brown fox
预期的输出是,
fox brown quick The
我正在遵循一个简单的算法,将整个句子翻转,然后将这些单词反转回来。 这是我的代码。
public static void reverseWords(char[] s) {
reverse(s);
int start = 0;
for (int i = 0; i < s.length ; i++) {
if(s[i] == ' '){
indexedReverse(s, start, i);
start = i+1;
}
}
}
private static void reverse(char[] s){
int len = s.length;
for(int i=0; i< len/2 ; i++){
char temp = s[i];
s[i] = s[len -1 -i];
s[len - 1- i] = temp;
}
}
private static void indexedReverse(char[] s, int start, int end){
for (int j = start; j <end/2; j++){
char temp = s[j];
s[j] = s[end - 1 - j];
s[end -1 -j] = temp;
}
}
public static void main(String[] args) {
String str = "The quick brown fox";
char[] s = str.toCharArray();
reverseWords(s);
String newStr = new String(s);
System.out.println(newStr);
}
问题是indexedReversed()函数只对第一个单词进入for循环一次,然后它完全跳过循环。我在这做错了什么。 我得到的输出是,
fox nworb kciuq ehT
答案 0 :(得分:4)
这里有一行可以完成所有工作:
String reversed = Arrays.stream(str.split(" ")).reduce((a, b) -> b + " " + a).get();
打破这个局面:
str.split(" ")
创建一个单词数组,放弃它们之间的空格Arrays.stream()
汇集了reduce()
可让您将所有流元素合并为一个值。 lambda (a, b) -> b + " " + a
通过将 next 值添加到最终值的 start 来组合元素get()
被调用是因为reduce()
返回Optional
来处理流中没有任何内容的情况,但我们知道因为split()
始终返回至少一个元素老实说,有时修复代码的方法是替换它,简单就是最好。
答案 1 :(得分:4)
您的indexedReverse
方法似乎没有考虑到单词开头的相对位置。
public static void reverseWords(char[] s) {
reverse(s);
int start = 0;
for (int i = 0; i < s.length ; i++) {
if(s[i] == ' '){
indexedReverse(s, start, i);
start = i+1;
}
}
}
private static void reverse(char[] s){
int len = s.length;
for(int i=0; i< len/2 ; i++){
char temp = s[i];
s[i] = s[len -1 -i];
s[len - 1- i] = temp;
}
}
private static void indexedReverse(char[] s, int start, int end){
int newEnd = start+(end-start)/2; // it worked for the first word because start = 0
for (int j = start; j <newEnd; j++){
char temp = s[j];
s[j] = s[end - 1 - j];
s[end -1 -j] = temp;
}
}
public static void main(String[] args) {
String str = "The quick brown fox";
char[] s = str.toCharArray();
reverseWords(s);
String newStr = new String(s);
System.out.println(newStr);
}
}
答案 2 :(得分:1)
对于它的价值,这里是Java 7
的替代解决方案,我认为更容易理解:
public static void main(String[] args) throws ParseException {
String quickBrownFox = "the quick brown fox";
String[] sentenceWords = quickBrownFox.split(" ");
StringBuffer reverse = new StringBuffer();
for(int i = sentenceWords.length - 1; i >= 0; i--){
reverse.append(sentenceWords[i] + " ");
};
System.out.println(reverse.toString());
}
此代码以相反的顺序循环遍历原始String
,并将每个单词追加到新的StringBuffer
。
<强>输出:强>
狐狸棕快速
答案 3 :(得分:0)
public static void reverseWords(char[] s) {
reverse(s);
int start = 0;
for (int i = 0; i < s.length ; i++) {
if(s[i] == ' '||s.length-1==i){
if(s.length-1==i)
i++;
indexedReverse(s, start, i);
start = i+1;
}
}
}
private static void reverse(char[] s){
int len = s.length;
for(int i=0; i< len/2 ; i++){
char temp = s[i];
s[i] = s[len -1 -i];
s[len - 1- i] = temp;
}
}
private static void indexedReverse(char[] s, int start, int end){
for (int j = start; j <(start+end)/2; j++){
char temp = s[j];
s[j] = s[end -1 -(j-start)];
s[end -1 -(j-start)] = temp;
}
}
public static void main(String[] args) {
String str = "The quick brown fox";
char[] s = str.toCharArray();
reverseWords(s);
String newStr = new String(s);
System.out.println(newStr);
}
答案 4 :(得分:0)
试试这个,
public static final String reverseString(String x){
return x.split("\\s+").reverse().join(' ');
}
可以使用
调用System.out.println(reverseString(line));