我是java的新手,并且正在开发一个crud计算器,它接受输入并将其保存在ArrayList中以执行计算。
我正在尝试在ArrayList<Character>
中添加两个值,然后将“+”替换为总和。
if(listEqu.contains('+')) {
while(listEqu.indexOf('+') > -1) {
int plus = listEqu.indexOf('+');
int prev = listEqu.get(plus-1);
int nxt = listEqu.get(plus+1);
Character sum = (char) (nxt + prev);
listEqu.set(plus, sum);
System.out.println(listEqu);
}
}
当输入为1+1
时,返回[1, b, 1]
。
我想要的是返回[1, 2, 1]
。
有什么建议?谢谢!
答案 0 :(得分:1)
问题实际上是添加两个字符并不符合您的预期。
'1' + '1'
的值为'b'
。如果您想要'1'
之后的下一个数字,则将整数1
添加到其中;即'1' + 1
是'2'
。
为了更深入地理解,您需要了解如何用Java表示字符数据。
Java中的每个char
值都是无符号的16位整数,对应于Unicode基本平面中的代码点(或字符代码)。这些代码点中的前128个(0到127)对应于旧ASCII字符集中的字符。在ASCII中,表示数字的代码是48(对于'0'
)到39(对于'9'
)。小写字母为97(对于'a'
)到122(对于'z'
)。
正如您所见,'1' + '1'
- &gt; 49 + 49
- &gt; 98
- &gt; 'b'
。
(实际上它还有很多东西。并非所有char
值都代表真实字符,而某些Unicode代码点需要两个char
值。但这超出了范围你的问题。)
如何指定添加数字而不是添加字符?
将字符(数字)转换为数字,执行算术,并将结果转换回字符。
阅读Character
类的javadoc;例如方法Character.digit
和Character.forDigit
。
请注意,这仅在数字保持在0到9范围内时有效。对于该范围之外的数字,字符表示由两个或更多字符组成。对于那些你应该使用String
而不是char
的人。 (A String
也应对1位数案例......)
答案 1 :(得分:0)
您应首先将prev
和nxt
转换为int值,然后将其添加到一起,如下所示:
if(listEqu.contains('+')) {
while(listEqu.indexOf('+') > -1) {
int plus = listEqu.indexOf('+');
int prev = Integer.parseInt(listEqu.get(plus-1));
int nxt = Integer.parseInt(listEqu.get(plus+1));
Character sum = (char) (nxt + prev);
listEqu.set(plus, sum);
System.out.println(listEqu);
}
}
答案 2 :(得分:0)
nxt和prev是char值。 Tey在ASCII表中取值,其中'1'为61,'b'为142(因此,'1'+'1'='b')
您需要减去'0'以获取它们代表的数字。 ('1' - '0'= 61 - 60 = 1)
总和不一定是一个字符可写的,所以你不应该把它放回一个char数组。
如果要将整数转换为字符串,请使用Integer.toString(i)。
(并且,如果你愿意,可以获取字符串的第一个字符并将其放入数组中,如果这是你想要的那样)
答案 3 :(得分:0)
在执行添加之前,需要将字符解析为相应的十进制值,然后再返回到字符。方法Character.digit(char, int)
和Character.forDigit(int, int)
可以做到这一点(我会使用char
,因为这是prev
和nxt
的类型。像,
char prev = listEqu.get(plus - 1);
char nxt = listEqu.get(plus + 1);
Character sum = Character.forDigit(Character.digit(nxt, 10)
+ Character.digit(prev, 10), 10);
答案 4 :(得分:0)
使用您的代码可以改善几件事情:
将字符1
转换为等效的整数值:
int prev = Integer.parseInt(String.valueOf(listEqu.get(plus-1)));
int nxt = Integer.parseInt(String.valueOf(listEqu.get(plus+1)));
// Note : int prev = listEqu.get(plus-1) would store an ascii value of `1` to prev value i.e 49
然后将这两个值的总和转换为Character
,然后使用Character.forDigit
将其添加到列表中:
Character sum = Character.forDigit(nxt+prev,10);
// Note Character sum = (char) (nxt + prev); is inconvertible
// and char sum = (char) (nxt + prev); would store character with ascii value 98(49+49) in your case 'b' to sum