StringBuffer sb=new StringBuffer("A");
现在增加字母A我写下面代码 -
if (sb.charAt(0)=='A') {
sb.setCharAt(0, 'B');
} else {
sb.setCharAt(0, 'C');
}
但在某处,我读到这可以通过以下代码完成(并且它有效!)
sb.setCharAt(0, (char)(sb.charAt(0) + 1));
有人可以解释上面的代码吗?
答案 0 :(得分:1)
执行时char + int
char
被解释为int
,表示Unicode表中已使用字符的索引。
因此,当您执行sb.charAt(0) + 1
时,它与'A' + 1
相同,并被评估为65 + 1
,等于66
(并且Unicode表中的character indexed with that value为{{ 1}})。
既然B
期望作为第二个参数setCharAt
,你必须(强制转换) char
到int
,这会让你回归{{1} }}和char
只是在StringBuffer中的'B'
位置设置该字符。
答案 1 :(得分:0)
如果第一个字符是A
,则将第一个字符更改为B
。否则,将第一个字符设置为C
。您修改后的版本
sb.setCharAt(0, (char) (sb.charAt(0) + 1));
只能以相同的方式分别输入A
和B
(因为它会增加StringBuffer
中的第一个字符。)
答案 2 :(得分:0)
pubEntry
将检索第一个字符。所以if (Meteor.isClient) {
Template.adminPublicationsEdit.helpers({
// ...
isChecked: function(type) {
return (this.type === type) ? "checked" : "";
}
// ...
});
}
会将第一个字符加1(将A转换为B,将B转换为C等)。所以,假设第一个字符是A.然后<template name="adminPublicationsEdit">
<!-- ... -->
<div class="form-group js-radios">
<label for="Outlet" class="col-sm-2 control-label">Outlet</label>
<div class="col-sm-10">
<label class="radio-inline">
<input type="radio" name="outlet-type" id="wp" value="wp" {{isChecked 'wp'}}>Working Paper</label>
<label class="radio-inline">
<input type="radio" name="outlet-type" id="pp" value="pp" {{isChecked 'pp'}}>Published Paper</label>
<label class="radio-inline">
<input type="radio" name="outlet-type" id="bk" value="bk" {{isChecked 'bk'}}>Book</label>
<label class="radio-inline">
<input type="radio" name="outlet-type" id="bc" value="bc" {{isChecked 'bc'}}>Book Chapter</label>
</div>
</div>
<!-- ... -->
</template>
所以你的方法是sb.charAt(0)
等。
答案 3 :(得分:0)
这是因为隐式转换。您可能知道,每个角色都有ASCII数字表示。例如,字母'A'是数字64.当你写
sb.setCharAt(0, (char) (sb.charAt(0) + 1));
它会自动将(隐式)字符转换为整数,因为它需要向其添加1。因此,您的结果变为64+1 = 65.
在此之后,您显式调用类型转换运算符(char)
,将整数65转换为它代表的char,并且它是B.