我试图平衡括号。我收到错误"无法将对象与基元进行比较"当我尝试做像stack.peek()==' {'我把它铸成了角色。编译器接受它,但警告不安全的操作。有没有人知道我能做到这一点的更好方法以及为什么我可以将字符串中的字符作为基元推送和弹出,但是当我偷看它时它不是原始的?
import java.util.*;
class Solution {
public int solution(String S) {
// write your code in Java SE 8
char[] C = S.toCharArray();
LinkedList stack = new LinkedList();
for(int i = 0; i< C.length; i++){
if(C[i] == '(' || C[i] == '[' || C[i] == '{'){
stack.push(C[i]);
}
if(C[i] == ')' && (char)stack.peek() == '('){
stack.pop();
}
else if (C[i] == ']' && (char)stack.peek() == '['){
stack.pop();
}
else if (C[i] == '}' && (char)stack.peek() == '{'){
stack.pop();
}
}
if(stack.size() == 0){
return 1;
}
else{
return 0;
}
}
}
答案 0 :(得分:2)
您正在使用LinkedList
的原始格式,该格式将存储Object
。您无法将Object
转换为char
。
使用通用LinkedList<Character>
。然后,peek()
将返回Character
,并且在将char
与==
进行比较时,Java会将其展开到LinkedList<Character> stack = new LinkedList<Character>();
。
peek()
然后你会发现你甚至不需要将char
的回报转换为{{1}}。
答案 1 :(得分:1)
如果您正确使用了LinkedList<T>
原始类型,则不会遇到此问题。将您的列表声明为LinkedList<Character>
,它应该有效。
答案 2 :(得分:1)
这是一篇不错的文章 - http://www.informit.com/articles/article.aspx?p=1932926&seqNum=5 它讨论了允许和不允许的演员表,例如它说
在任何情况下你都做不到的事情是从一个对象转换为一个原始数据类型,反之亦然.Primitive类型和对象在Java中是非常不同的东西,你不能在两者之间自动转换。 “
仅供将来参考,以防万一链接列表无法设置为特定类型(因为它可能在某些情况下发生)代码只需要执行.equals除了== for stack.peek()是一个对象和物体需要.equals进行比较。铸件刚刚被取出。
public static void main(String[] args)
{
System.out.println(solution("{"));
}
public static int solution(String s) {
char[] C = s.toCharArray();
LinkedList stack = new LinkedList();
System.out.println("Length:" + C.length);
for(int i = 0; i< C.length; i++){
if(C[i] == '(' || C[i] == '[' || C[i] == '{'){
stack.push(C[i]);
}
System.out.println("Peek" + (C[i] == '}'));
if(C[i] == ')' && stack.peek().equals('(')){
stack.pop();
}
else if (C[i] == ']' && stack.peek().equals('[')){
stack.pop();
}
else if (C[i] =='}' && stack.peek().equals('{')){
System.out.println("POPPED");
stack.pop();
}
}
if(stack.size() == 0){
return 1;
}
else{
return 0;
}
}
但更好的方法是CharacterList类型的LinkedList
两种解决方案都不需要铸造