使用indexOf()遍历单个字符串列表

时间:2014-10-01 22:02:39

标签: java list encryption indexof

我正在制作一个程序,它将采用输入字符串并使用Rot13加密方法对其进行解码。这将采用字母表,并将其旋转13。

我很难在列表中找到一个字母的索引,每次运行它都会给我-1,好像该项目不在列表中。我查看了java文档,indexOf()请求一个对象。我试着明确地输入我的输入作为对象,但这也不起作用。

这是我到目前为止的代码:

package rot13;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.List;

/**
 *
 * @author andrewjohnson
 */
public class CipherKey {

    List<String> alpha = Arrays.asList("A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", " ");
    List<String> alphaRev = Arrays.asList("Z", "Y", "X", "W", "V", "U", "T", "S", "R", "Q", "P", "O", "N", "M", "L", "K", "J", "I", "H", "G", "F", "E", "D", "C", "B", "A", " ");

    public String codeDecode(String s) {
        System.out.println(s);

        for (int i = 0; i < s.length(); i++) {
            char ch = s.charAt(i);
            //System.out.println(ch);
            int x = alpha.indexOf(ch);
            //System.out.println(x);
            String y = alphaRev.get(x);
            System.out.print(y);
        }

        return null;
    }

    public static String readInput() throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        System.out.println("Enter message to be encoded or decoded");

        String s = br.readLine().toUpperCase();
        //System.out.println(s);

        return s;

    }
}

我的主要():

/**
 *
 * @author andrewjohnson
 */
public class Rot13 {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) throws IOException {
        CipherKey x = new CipherKey();


        x.codeDecode(x.readInput());
    }

}

我不确定它为什么不起作用,但我把它缩小到了这条线:

 int x = alpha.indexOf(ch);

无法在alpha中找到ch。我是Java的新手,我已经尝试了所有我能想到的东西。谢谢你的建议!

3 个答案:

答案 0 :(得分:0)

问题在于:

char ch = s.charAt(i);

int x = alpha.indexOf(ch); // <-------- HERE

您正在char阵列中搜索String。这当然不存在。强调-1

将其更改为int x = alpha.indexOf("" + ch);

int x = alpha.indexOf(Character.toString(ch));

int x = alpha.indexOf(String.valueOf(ch));

任何这些都可以。

答案 1 :(得分:0)

ch的类型为char,您的列表中包含String。列表可以接受Object的{​​{1}},但类型仍然有效。

indexOf更改为int x = alpha.indexOf(ch);以修复此问题。

示例:

int x = alpha.indexOf(String.valueOf(ch));

将打印

System.out.println(alpha.indexOf('D'));
System.out.println(alpha.indexOf(String.valueOf('D')));

答案 2 :(得分:0)

  1. 这不是rot13算法 - 你似乎正在逆转字母表。 rot13将范围A - M映射到N - Z,反之亦然。两次对rot13的调用会返回原始文本。

  2. ASCII字母遵循数字序列。不是通过列表执行线性搜索来查找匹配的索引,而是更快地计算当前字母与A之间的差异,然后使用该差异偏移到第二个字符数组(或字符串)。

  3. static String map = "NOPQRSTUVWXYZABCDEFGHIJKLM";  // for rot13
    
    function rot13(String input) {
        StringBuffer output;
        for (char ch : input) {
            int index = ch - 'A';
            if (ch >= 0 && ch < 26) {
                output.append(map.charAt(index));
            } else {
                output.append(ch);
            }
        }
        return output.toString();
    }
    

    注意:未经测试,可能无法编译,E&amp; OE等