0

我创建了这段代码,它查看一个字符串标记并对其进行格式化,以便每个字符都移动一个。字符都是小写的,从 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));
            }
        }
4

2 回答 2

3

一个带有一点模运算的简单循环就可以了,为什么要打扰这么多对象呢?

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

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

于 2012-11-24T01:48:53.953 回答
2

Apache commons-lang 库具有StringUtils.replaceChars()可以为您执行此操作的实用程序方法:

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

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

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

于 2012-11-24T01:58:14.040 回答