首页 > 解决方案 > 我正在用java编写一个函数,它将第一个字符放在第三位,只要单词是,它每三个字符重复一次

问题描述

以下是我拥有的功能,它给了我想要的结果,但我想知道是否有其他方法可以解决这个问题?可能是嵌套for循环?

public class RandomFunctionalities2 {
    public String mixWords(String firstWord, String secondWord) {
        return firstWord+secondWord;
    }

    public String switcheroo(String word) {
        if (word.length() < 3) {
            return word;
        }
        StringBuilder c = new StringBuilder();
        int i;
        for (i = 0; i < 3 * (word.length() / 3); i+=3)
            c.append(word.substring(i + 1, i + 3) + word.charAt(i));

        c.append(word.substring(i));
        return c.toString();
    }
}

测试*

    public class testingRandomFunctionalities2 {
        public static void main(String[] args) {
            RandomFunctionalities2 rf1 = new RandomFunctionalities2();
            
    
            System.out.println(rf1.switcheroo("george"));
            System.out.println(rf1.switcheroo("you"));
        }
    }

测试结果*

eogger
ouy

Process finished with exit code 0

标签: java

解决方案


另一种方法可能是在每 3 个字符处拆分您的输入,并在交换每个子字符串的第一个和第三个字符后加入:

public String switcheroo2(String word) {
    String[] split = word.split("(?<=\\G...)");
    StringBuilder sb = new StringBuilder();
    for (String s : split){
        if(s.length() > 2){
            sb.append(s.substring(1)).append(s.charAt(0));
        }
        else {
            sb.append(s);
        }
    }
    return sb.toString();
}

您可以使用 Pattern 类和流通过执行以下操作来保存更多行:

public String switcheroo3(String word) {
    UnaryOperator<String> op = str -> str.length() < 3 ? str : str.substring(1) + str.charAt(0);
    return Pattern.compile("(?<=\\G...)")
                    .splitAsStream(word).map(op::apply)
                    .collect(Collectors.joining());
}

推荐阅读