我正在尝试实现一个简单的cesar密码。我在使用基于新键[]编码字符串的函数时遇到问题。我在这里展示了如何设置我的密钥。
private String[] alphabet = {"a", "b", "c","d", "e", "f","g", "h", "i","j", "k", "l","m", "n", "o",
"p", "q", "r","s", "t", "u","v", "w", "x","u", "z"};
public String[] CoderNewKey(int shift) {
_NewKey = null;
_NewKey = new String[25];
for (int i = 0; i < 25; i++) {
_NewKey[i] = alphabet[(i + shift) % 25];
}
return _NewKey;
}
我遇到的问题是Coder,if语句都不是真的,而rtnstring总是只是“”。
public String Coder(String[] key, String msg){
String rtnstring = "";
for ( int i = 0; i < msg.length();i++){
for (int x = 0; x<26 ; x++){
if ( msg.substring(i, i+1) == alphabet[x]){
rtnstring.concat(key[x]);
}if (msg.substring(i, i+1) == " "){
rtnstring.concat(" ");
}
}
}
return rtnstring;
}
这是我编码器方法的逻辑。
它一次通过String msg 1个字母。它将字母与字母表中的索引匹配,然后根据给定键中的索引创建一个新字符串。
答案 0 :(得分:9)
您希望使用char
代替String
; char
值是单个字符,这是您正在使用的。要比较String
个对象,您需要使用equals()
,但可以将==
与char
一起使用。
答案 1 :(得分:5)
您需要使用String类中的equals()
方法。当您使用==
时,您正在比较两个对象的引用变量(在您的代码中不相同)
+----------+ +----------+
| | What you need | |
| " " <-------to compare-----------> "a" |
| | | |
| | | |
+----------+ +----------+
^ ^
| |
+ What you +
rtnstring <------+ erroneously +----> msg
compare
答案 2 :(得分:4)
在Java中,==总是只比较两个引用(对于非基元,即),即它测试两个操作数是否引用同一个对象。
但是,可以覆盖equals方法 - 因此两个不同的对象仍然可以相等。
例如:
String x = "hello";
String y = new String(new char[] { 'h', 'e', 'l', 'l', 'o' });
System.out.println(x == y); // false
System.out.println(x.equals(y)); // true
答案 3 :(得分:2)
首先代替substring
使用函数charAt
,然后将String[]
更改为char[]
,即
private char[] alphabet = {'a', 'b', .... , 'z'};
和
if ( msg.charAt(i) == alphabet[x])
在您的示例中,您使用的是String
,当您使用==
时,它会比较引用,而substring
函数将始终返回一个新的string
,以避免此类问题的使用而是equals(String)
。
为了更好地理解,请阅读Java Documentation该示例将为您提供String
初始化的详细信息以及references
相等的含义。
答案 4 :(得分:1)
equals()
方法比较字符串,而不是 == 。 equals()方法用于检查 String 文字有意义的等价是否
public String Coder(String[] key, String msg){
String rtnstring = "";
for ( int i = 0; i < msg.length();i++){
for (int x = 0; x<26 ; x++){
if ( msg.substring(i, i+1).equals(alphabet[x])){
rtnstring.concat(key[x]);
}if (msg.substring(i, i+1).equals(" ")){
rtnstring.concat(" ");
}
}
}
return rtnstring;
}
答案 5 :(得分:1)
if ( msg.substring(i, i+1).equalIgnoreCase(alphabet[x])){
rtnstring.concat(key[x]);
}
if (msg.substring(i, i+1).equalIgnoreCase(" ")){
rtnstring.concat(" ");
}
如果是字符串,您的比较应使用equalIgnoreCase
或equal
,但如果您只想比较字符
// first define array of characters
private char[] alphabet = {'a', 'b', ..... 'z'};
// then you can use ==
if ( msg.charAt(i)== alphabet[x]){
rtnstring.concat(key[x]);
}
if (msg.charAt(i) == '\b')){
rtnstring.concat(" ");
}
答案 6 :(得分:0)
私人Char [] alphabet = {'a','b','c','d','e','f','g','h','i','j', 'k','l','m','n','o','p','q','r','s','t','u','v','w ','x','u','z'};
我把你的String变成了char(字符)。如果您选择更改为char,则可以继续使用==。