【问题标题】:Better way to change string "abc..z" to "bcd..a"?将字符串“abc..z”更改为“bcd..a”的更好方法?
【发布时间】:2024-01-14 12:56:01
【问题描述】:

我创建了这段代码,它查看字符串标记并对其进行格式化,以便每个字符都移动一个。字符全部小写,从a到z。

如果我的输入是
abcz
输出为
bcda

现在我将所有字母添加到数组列表中,代码确定每个字符的索引并向其添加一个。如果找到 z,它会打印 a,这样 arraylist 的索引就不会超出范围。

List<String> letters = new ArrayList<String>(); 
        String alp = "abcdefghijklmnopqrstuvwxyz";
        for (int i = 0; i<26; i++)
        {
            letters.add(Character.toString(alp.charAt(i)));
        }

        String token = sc.next();
        for (int i = 0; i<token.length(); i++)
        {
            if (letters.get(letters.indexOf(Character.toString(token.charAt(i)))).equals("z"))
            {
                System.out.print("a");
            }
            else
            {
            System.out.print(letters.get(letters.indexOf(Character.toString(token.charAt(i)))+1));
            }
        }

【问题讨论】:

  • 那么你的问题是什么?您在寻找什么样的改进:更少的代码、更好的性能、更好的编码风格?您在实施过程中遇到任何问题吗?上下文是什么,你需要这个函数做什么?

标签: java string format token


【解决方案1】:

一个简单的循环和一些模运算就可以了,为什么要麻烦这么多对象呢?

for(int i = 0; i < token.length(); ++i) {
    System.out.print(('a' + (token.charAt(i) + 1 - 'a')%('z' - 'a' + 1)));
}

我们将'a' 的偏移量加一,然后取余数模 26 得到 0 到 25 范围内的偏移量。

【讨论】:

  • Troo dat,但 26 更短。
  • 但是@vladr 的解决方案提供了更大的灵活性,例如,如果他想将其升级为 rot13 或类似的更“高级”加密。
【解决方案2】:

Apache commons-lang libraryStringUtils.replaceChars() 实用方法可以为您执行此操作:

StringUtils.replaceChars(input, "abcdefghijklmnopqrstuvwxyz", "bcdefghijklmnopqrstuvwxyza");

虽然有这么大的参数,但看起来有点丑陋的一面。

尽管如此,它只是一行,恕我直言,最好的代码是别人的代码(意思是,如果有一个库可以做到这一点,请倾向于使用它)。

【讨论】: