情况:我有两个字符串存储在字符串数组中。
目标:我想将两个字符串中的所有字符添加到字符串变量
out
。
String out = "";
for(int i = 0; i < strArr[0].length(); i++){
char x = strArr[0].charAt(i);
for(int j = 0; j < strArr[1].length(); j++){
char y = strArr[1].charAt(j);
if(x.equals(y)){
out.concat(x + ",");
}
}
}
if(out.equals("")){
out = "false";
}
问题:当我运行代码时,出现以下错误:
char cannot be dereferenced
if(x.equals(y)){
^
我也尝试过这个:
if(x == y){
out.concat(x + ",");
}
但是也不起作用。
要比较两个
char
值,请使用 == 运算符 x == y
。
它似乎不起作用的原因是另一个:您使用的out.concat()
方法不会修改
out
。一般来说,字符串是“不可变的”——你不能改变字符串的值。使用 StringBuilder 而不是 String 作为
out
变量。
StringBuilder out = new StringBuilder();
for(int i = 0; i < strArr[0].length(); i++){
char x = strArr[0].charAt(i);
for(int j = 0; j < strArr[1].length(); j++){
char y = strArr[1].charAt(j);
if (x == y){
out.append(x + ",");
}
}
}
==
进行比较。字符串是不可变的。
调用
out.concat("whatever")
不会更改
out
的值。您必须将返回值分配给
out
。
if(x == y){ // compare primitive with ==
out = out.concat(x + ","); // assign the returned value
}
String
是不可变的,我会更进一步并建议一种替代方法来迭代字符串。
HashSet<T>
有两种方法可以简化您的代码。
addAll
和
retainAll
。
String out = "";
HashSet<String> hashSet = new HashSet<>();
hashSet.addAll(strArr[0]);
hashSet.retainAll(strArr[1]);
out = hashSet.toString();
if(out.equals("")){
out = "false";
}
我发现西装是 ASCII 顺序 C D H S
但是 suite 的值不是按 ASCII 顺序排列的。我将 10、J、Q、K A 的值重新映射到字符 A、B、C、D、E,以使其符合 ASCII 顺序。
//int posCard = beforeOrAfter(card2Sort, cardIterate, 0, iterMax);
int posCard = beforeOrAfter2(card2Sort, cardIterate);
而 beforeOrAfter2 是
/* -1 wordA before wordB
* 0 wordA equal wordB
* 1 wordA after wordB
* suite order less C D H S higher
* value suit less 0 1 2 3 4 5 6 7 8 9 A J K Q
* map 10 to A
* J to B
* Q to C
* K to D
* A to E
*/
private static int beforeOrAfter2(String wordA, String wordB) {
//System.out.print("word "+wordA+" "+wordB+" "); // debug
char charA = wordA.charAt(wordA.length()-1);
char charB = wordB.charAt(wordB.length()-1);
System.out.println(wordA+" "+wordB+" End "+charA+" "+charB+" "); // debug
if (charA<charB) {
return -1;
} else if (charA>charB) {
return 1;
} else {
// equal
charA = wordA.charAt(wordA.length()-2);
charB = wordB.charAt(wordB.length()-2);
// mapping charA to correct order
if (charA=='0') {
charA='A';
} else if (charA=='J') {
charA='B';
} else if (charA=='Q') {
charA='C';
} else if (charA=='K') {
charA='D';
} else if (charA=='A') {
charA='E';
}
// mapping charB to correct order
if (charB=='0') {
charB='A';
} else if (charB=='J') {
charB='B';
} else if (charB=='Q') {
charB='C';
} else if (charB=='K') {
charB='D';
} else if (charB=='A') {
charB='E';
}
System.out.println(" First "+charA+" "+charB); // debug
if (charA<charB) {
return -1;
} else if (charA>charB) {
return 1;
}
}
return 0;
}