2014-09-23 1 views
0

Я пытаюсь балансировать круглые скобки. Я получал сообщение об ошибке «не может сравнивать объекты с примитивами», когда я пытался сделать что-то вроде stack.peek() == '{' Я передал его персонажу. Компилятор берет его, но предупреждает о небезопасных операциях. Кто-нибудь знает лучший способ, которым я могу это сделать, и почему я могу нажимать и вызывать персонажи из стека в качестве примитивов, но это не примитивно, когда я заглядываю?возвращение данных из стека Java

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

вы видите авто-бокс. Вы должны использовать общие коллекции. – SLaks

ответ

2

Вы используете необработанный форму LinkedList, которая будет хранить Object с. Вы не можете наложить Object на номер char.

Использовать общий LinkedList<Character>. Затем peek() вернет Character s, и Java распакует их до char с при сравнении с ==.

LinkedList<Character> stack = new LinkedList<Character>(); 

Тогда вы обнаружите, что вам даже не нужно отбрасывать возвращение peek() к char.

+0

просто любопытно, будет ли он работать, если бы я использовал связанный список и использовал .equals ('}'), чтобы сравнить объект с символом или работает .equals() работает только между двумя объектами? Я до сих пор не понимаю точки параметризованных типов. – user137717

+0

Если вы использовали 'stack.peek(). Equals ('}')', то это должно работать, потому что 'char' будет помещен в« Символ ». Однако это не будет работать с другими сравнениями, такими как 'C [i] == '('', потому что вы не можете вызывать такие методы, как 'equals', для примитивных типов, таких как' char'. повышенная безопасность. – rgettman

1

У вас не было бы этой проблемы, если бы вы правильно использовали LinkedList<T> raw-type. Объявите свой список как LinkedList<Character>, и он должен работать.

1

Это хорошая статья - http://www.informit.com/articles/article.aspx?p=1932926&seqNum=5 Это говорит о слепков, которым разрешено и не разрешено, например, он говорит

Одна вещь, которую вы не можете сделать ни при каких обстоятельствах отлит из объекта к типу примитивного данных, или вице-versa.Primitive типы и объекты очень разные вещи в Java, и вы не можете автоматически бросить между ними.»

Просто для дальнейшего использования только в случае, если связанный список может» t быть установленным для определенного типа (потому что это может произойти в некоторых cir cumstances). Код просто должен делать .equals, кроме == для 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; 
} 
} 

Но лучший способ будет LinkedList типа Character

И не отливка не нужен ни для решения