【问题标题】:String reverse, wrong results字符串反转,错误的结果
【发布时间】:2018-03-08 20:50:25
【问题描述】:

所以我的问题是关于获得反转字符串,但只有更长或等于 5 个字符的单词。 因此,如果我们将(“Hey Fellow Warriors”)传递给该方法,我们应该得到“Hey wollef sroirraw”作为回报。我的代码给了我一些奇怪的结果,它们是=“sroirraw Fellow Warriors”。

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

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());     
    }
}

【问题讨论】:

  • 错字:int y = 0; 应该没有循环。
  • 这意味着您当前,在每次迭代中,使用默认的 0 值再次覆盖 y
  • 天哪,我真是瞎了眼,谢谢 :o
  • 那里还有很多toString() 方法调用。您不需要 prntln 中的那个,因为您的 spinWords 返回一个字符串。你不必toStringString
  • 从 Java 8 开始我们有 String.join 所以第二个循环可能会被它替换。

标签: java string reverse


【解决方案1】:

首先,我希望使用匹配一个或多个空白字符的\\s+ 进行拆分。其次,我会在标记 I split 上使用带有 Arrays.stream 的 lambda。然后我会 map 每个单词,用 5 个或更多字符反转每个单词。这可以通过StringBuilderreverse() 来完成。由于此方法不需要任何实例状态,我们可以将其设为static。最后,将后面的单词与Collector 连接在一起。喜欢,

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"));
}

哪个给出(指定)

Hey wollef sroirraw

【讨论】:

  • 谢谢,我是初学者,所以我什至不知道地图和收集机制以及您提供的这种语法,但令人惊讶的是我的代码会如此简短和清晰。
【解决方案2】:

下面的这段代码可以工作。您在循环中添加了 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();
}   
}

【讨论】:

    【解决方案3】:

    您需要从for loop 中定义 y 并在第二个循环之前将其值设为零,因为您在每个循环中都重置了 y 的值。

    【讨论】:

      【解决方案4】:

      你可以用更简单的方式来做:

      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;
      }   
      

      【讨论】:

        猜你喜欢
        • 2020-01-03
        • 1970-01-01
        • 1970-01-01
        • 2021-10-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-09
        相关资源
        最近更新 更多