我正在制作一个程序,它将采用输入字符串并使用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的新手,我已经尝试了所有我能想到的东西。谢谢你的建议!
答案 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)
这不是rot13算法 - 你似乎正在逆转字母表。 rot13将范围A - M
映射到N - Z
,反之亦然。两次对rot13的调用会返回原始文本。
ASCII字母遵循数字序列。不是通过列表执行线性搜索来查找匹配的索引,而是远更快地计算当前字母与A
之间的差异,然后使用该差异偏移到第二个字符数组(或字符串)。
即
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等