颠倒五个字母或更多字母的单词中的字符顺序

Reverse the order of characters within words with five letters or more

我是 Java 的新手,我还在学习中。作为我学习的一部分,我接受了一个挑战,编写了一个程序,该程序将接受一个字符串,并检查是否有任何长度为 5 或更多的单词,如果有,它将翻转 5+ 长单词中的字符.挑战在于不使用 Collections.reverse(list) 或 StringBuilder.

我的想法是,编写 2 个方法很简单。 Main 将拆分字符串,并通过每个字符串数组索引进行迭代以查找 5+ 长单词,并且将在 'if' 条件内触发名为 'reverse' 的方法。看起来这个工作正常。 对于反向方法,想法是将单词拆分为一个数组,然后借助 2 个嵌套 'for' 循环遍历 'ori' 和辅助 'rev' 数组的索引以分配索引 ori 的值[i] 索引 rev[j].

所以从 i=0 和 j=arr.length-1 开始将导致从 ori[0] 到 rev[7] 的句子单词中分配值“s”,然后从 ori 中分配值“e” [1] 到 rev[6],依此类推,所以结果将是 [e, c, n, e, t, n, e, s]

相反,我得到这样的输出:

[This, [e, e, e, e, e, e, e, e], will, [n, n, n, n, n, n, n], [s, s, s, s, s], with, more, than, five, [., ., ., ., ., ., ., .]]

我尝试了很多方法来解决问题,但到目前为止我的逻辑都失败了。有人可以解释一下吗,我做错了什么,我怎么搞砸了这个看似简单的逻辑?

稍后我会弄清楚如何将其显示为不带方括号和逗号的常规句子,所以到目前为止这不是问题。

代码:

import java.util.Arrays;

public class Main {
    public static void main (String[] args) {

        String original = "This sentence will contain words with more than five letters.";
        String[] splitter = original.split(" ");
        for (int i = 0; i < splitter.length; i++){
            if (splitter[i].length() >= 5){
                splitter[i] = reverse(splitter[i]);
            }
        }
        System.out.println(Arrays.toString(splitter));

    }
    public static String reverse (String s){
        String [] ori = s.split("");
        String [] rev = new String[ori.length];
        for (int i = 0; i < rev.length; i++) {
            for (int j = rev.length-1; j >=0; j--) {
                rev[j] = ori[i];
            }
        }
        s = Arrays.toString(rev);
        return s;
    }
}

新手请谅解:)

我尝试修改这部分:

public static String reverse (String s){
        String [] ori = s.split("");
        String [] rev = new String[ori.length];
        for (int i = 0; i < rev.length; i++) {
            for (int j = rev.length-1; j >=0; j--) {
                rev[j] = ori[i];

通过交换 i/j、rev[i] = ori[j]、--j、j > 0 和许多其他方法,主要是盲目的寻找我的逻辑失败的灵感。

您好 Pawel Niewolak,问题出在您的反向功能上。

根据您的要求使用:

 public static String reverse(String s) {
        String[] ori = s.split("");
        String[] rev = new String[ori.length];

        for (int i = 0; i < rev.length; i++) {
            rev[i] = ori[rev.length - i - 1];
        }
        s = "";
        for (String str : rev) {
            s += str;
        }
        return s;
    }
}

这是另一种使用现有字符数组的可能性。

  • 使用 String.toCharArray()
  • 创建数组
  • 遍历数组half-way,简单地交换结束字符向内移动。
  • 然后由于 String 构造函数将字符数组作为参数,return new String(array)
public static String reverse(String s) {
    char[] array = s.toCharArray();
    for (int i = 0; i <array.length/2; i++) {
        char ch = array[i];
        array[i] = array[array.length-i-1];
        array[array.length-i-1] = ch;
    }
    return new String(array);
}

请注意,对于偶数长度的字符串,中间的两个字符会被交换。对于奇数长度的字符串,中间字符保持不变。