Java 字符串反转,结果错误

Java 字符串反转,结果错误,java,string,reverse,Java,String,Reverse,所以,我的问题是得到反向字符串,但只得到更长或等于5个字符的单词。 因此,如果我们通过(“嘿,勇士们”)的方法,我们应该得到“嘿,沃尔夫·斯罗亚罗”作为回报。我的代码给出了一些奇怪的结果,它们是=“sroirraw战友” 这是我的密码,请给我一些线索。最后一个单词后面的空格不应该被返回,但我不知道为什么 public class PrimeChecker { public String spinWords(String sentence) { String[] tablica = s

所以,我的问题是得到反向字符串,但只得到更长或等于5个字符的单词。 因此,如果我们通过(“嘿,勇士们”)的方法,我们应该得到“嘿,沃尔夫·斯罗亚罗”作为回报。我的代码给出了一些奇怪的结果,它们是=“sroirraw战友”

这是我的密码,请给我一些线索。最后一个单词后面的空格不应该被返回,但我不知道为什么

public class PrimeChecker {

public String spinWords(String sentence) {

    String[] tablica = sentence.split(" ");

    for ( String x : tablica ) {
        int y = 0;
        if (  x.length() >= 5 ) {
            StringBuilder p = new StringBuilder(x).reverse();
            x = p.toString();
        }
        tablica[y] = x;
        y++;            
    }

    StringBuilder wynik = new StringBuilder();

    for ( String z : tablica ) {
        int y = 0;
        tablica[y] = z;
        wynik.append(tablica[y]);
        if (tablica.length > 1 && y != tablica.length - 1 ) {
            wynik.append(" ");
        }
        y++;
    }
    return wynik.toString();
}   
}
测试员

public class PrimeCheckerTest {
    public static void main(String[] args) {
        PrimeChecker obiekt = new PrimeChecker();
        System.out.println(obiekt.spinWords("Hey fellow warriors").toString());     
    }
}

首先,我希望使用与一个或多个空格字符匹配的
\\s+
进行拆分。其次,我将在标记I
split
上使用带有
array.stream
的lambda。然后我将
映射每个单词,用5个或更多字符反转每个单词。这可以通过
StringBuilder
reverse()
实现。由于这个方法不需要任何实例状态,我们可以使它
静态
。最后,用
收集器将单词backs连接在一起。像

public static String spinWords(String sentence) {
    return Arrays.stream(sentence.split("\\s+"))
            .map(s -> s.length() >= 5 ? new StringBuilder(s).reverse().toString() : s)
            .collect(Collectors.joining(" "));
}
并对其进行测试

public static void main(String[] args) {
    System.out.println(spinWords("Hey fellow warriors"));
}
其中给出(按规定)


下面的代码将起作用。您已经在循环中添加了y=0。这是没有必要的

public class PrimeChecker {

public String spinWords(String sentence) {

String[] tablica = sentence.split(" ");
int y = 0;
for ( String x : tablica ) {

    if (  x.length() >= 5 ) {
        StringBuilder p = new StringBuilder(x).reverse();
        x = p.toString();
    }
    tablica[y] = x;
    y++;            
}

StringBuilder wynik = new StringBuilder();
y=0;
for ( String z : tablica ) {

    tablica[y] = z;
    wynik.append(tablica[y]);
    if (tablica.length > 1 && y != tablica.length - 1 ) {
        wynik.append(" ");
    }
    y++;
}
return wynik.toString();
}   
}

您需要在循环的
中定义y,并且在第二个循环之前将其值设为零,因为您可以重置每个循环的y值。

您可以用一种更简单的方法执行此操作:

public String spinWords(String sentence) {

    String[] tablica = sentence.split(" ");

    for (int i = 0; i < tablica.length; i++) {

        if(tablica[i].length() >= 5) {
            StringBuilder p = new StringBuilder(tablica[i]).reverse();
            tablica[i] = p.toString();
        }
    }

    StringBuilder builder = new StringBuilder();
    for(String s : tablica) {
        builder.append(s + " ");
    }
    String str = builder.toString();

    return str;
}   
publicsstringspinwords(字符串语句){
String[]tablica=句子.split(“”);
for(int i=0;i=5){
StringBuilder p=新的StringBuilder(tablica[i]).reverse();
tablica[i]=p.toString();
}
}
StringBuilder=新的StringBuilder();
用于(字符串s:tablica){
builder.append(s+“”);
}
字符串str=builder.toString();
返回str;
}   

Typo:
int y=0
应该是循环外的。这意味着您当前在每次迭代时,都会使用默认的
0
值再次覆盖
y
。哦,我的天啊,我太瞎了,谢谢:oYou还有很多
toString()
方法调用。您不需要prntln中的字符串,因为spinWords返回字符串。您不必
toString
a
String
,因为Java 8中有String.join,所以第二个循环可能会被它取代。谢谢,我是初学者,这就是为什么我甚至不知道map和collect机制以及您介绍的语法的原因,但我的代码会如此简短和清晰,令人惊讶。
public String spinWords(String sentence) {

    String[] tablica = sentence.split(" ");

    for (int i = 0; i < tablica.length; i++) {

        if(tablica[i].length() >= 5) {
            StringBuilder p = new StringBuilder(tablica[i]).reverse();
            tablica[i] = p.toString();
        }
    }

    StringBuilder builder = new StringBuilder();
    for(String s : tablica) {
        builder.append(s + " ");
    }
    String str = builder.toString();

    return str;
}