附加的Java StringBuilder字符返回不需要的数字

时间:2018-06-04 19:09:26

标签: java unicode append stringbuilder bluej

如果这是一个以前已经回答的基本问题(我试过看但我没找到任何东西),我感到非常抱歉。

我正在尝试编写以下Java方法:

 String winningCard(String trick, char trump) {
    StringBuilder sb = new StringBuilder();
    char suit;
    char rank;
    for(int i = 1;   i < trick.length(); i+=2) {
        if(trick.charAt(i) == trump) {
            suit = trick.charAt(i);
            rank = trick.charAt(i-1);
            sb.append(rank + suit); //issue here, returns a weird number
            break;
        }
    }
    String result = sb.toString();
    return result;
}

当使用这些参数调用“8s7hQd”,例如'h'时,它应该返回“7h”。

如果我将StringBuilder更改为仅附加套装或等级,它就可以了,但是如果我按照它的方式放置它会返回“159”,我认为这与unicode编码有关。

如果有一种可以告诉我我失踪的东西,我非常感激。

提前致谢

4 个答案:

答案 0 :(得分:2)

suitrank基本上都是数字。 +正在添加这些数字并附加它。

如果在{I}之间放置"",则会按照您的意图追加字符,因为它会强制编译器将+与字符串一起使用。

sb.append(rank + "" + suit);

答案 1 :(得分:2)

append(rank).append(suit);

应该做的伎俩

答案 2 :(得分:1)

+是一个棘手的事情,因为它在不同的背景下意味着不同的东西。

  • 如果至少有一个操作数是String,则它将充当字符串连接运算符。
  • 如果两个操作数都是数字,或通过拆箱转换为数字,则它将作为数字加法运算符。

你给它两个char:这些是数字,所以会出现数字加法。

在添加两个字符之前,它们被扩展为int;结果也是int。你将这个int附加到字符串构建器,因此是“不需要的”数字。

因此,要么完全避免使用加法运算符:

sb.append(rank).append(suit);

或者确保使用字符串连接运算符:

sb.append("" + rank + suit);
// Left-associative, so evaluated as
// ("" + rank) + suit

sb.append(String.valueOf(rank) + suit);
// Etc.

但实际上,您不需要执行任何操作:只需附加子字符串:

sb.append(trick, i-1, i+1);

这会像trick一样提取trick.substring(i-1, i+1)字符串的一部分,但不会创建新字符串。

你不需要循环

答案 3 :(得分:0)

你可以直接说那些字符应该被解释为String by

sb.append(String.valueOf(rank) + String.valueOf(suit))