2015-04-03 5 views
-1

Итак, я работаю над калькулятором PostFix, который используется в командной строке для проекта класса, и у меня возникают небольшие проблемы с созданием памяти для него. Мне сказали создать хэш-карту, и я исследовал ее и понял ее основы. У меня есть метод вычисления, но у меня возникают проблемы с попыткой реализовать способ объявления переменных. Например, это то, что пользователь должен быть в состоянии сделать:Как реализовать HashMap в моем коде, я пытаюсь использовать его в качестве памяти?

> a = 3 5 + 1 - 
7 
> bee = a 3 * 
21 
> a bee + 
28 
> bee 3 % 
0 
> a = 4 
4 
> 57 
57 
> 2 c + 
c not found 
> mem 
a: 4 
bee: 21 
> exit 

Как вы можете видеть, пользователь может объявить переменные в формате «=» Моя проблема в том, что я не совсем уверен, как реализовать Hashmap , Я попытался сделать это, установив имя переменной для hashmap, получив ее из списка массивов и получив целочисленное значение из нее, получив возвращаемое значение из моего метода вычисления, но все, что я получаю, это ошибка:

>Exception in thread "main" java.lang.NumberFormatException: For input string: " 
Error" 
     at java.lang.NumberFormatException.forInputString(Unknown Source) 
     at java.lang.Integer.parseInt(Unknown Source) 
     at java.lang.Integer.parseInt(Unknown Source) 
     at Program6.main(Program6.java:42) 

Сейчас еще мой код:

import java.util.*; 
import java.io.*; 
public class Program6 
{ 
    private static HashMap<String,Integer> memory = new HashMap<>(); 
    public static void main(String args[]) 
    { 
     System.out.println("Servando Hernandez"); 
     System.out.println("RPN command line calculator"); 
     Scanner scan = new Scanner(System.in); 
     System.out.print(">"); 
     while(scan.hasNextLine()) 
     { 
      System.out.print("> "); 
      String a = scan.nextLine(); 
      String b = "quit"; 
      String c = "mem"; 
      String d = "clear"; 

      if(a.equals(b)) 
      { 
       System.exit(0); 
      } 
      else 
      { 
       System.out.println(compute(a)); 
      } 
      System.out.print(">"); 

      List<String> list = new ArrayList<String>(); 
      if(!a.isEmpty()) 
      { 
       StringTokenizer var = new StringTokenizer(a); 
       while(var.hasMoreTokens()) 
       { 
        list.add(var.nextToken()); 
       } 
      } 
      int pos = 0; 
      if (compute(a) != null) 
      { 
       pos = Integer.parseInt(compute(a)); 
      } 



      memory.put(list.get(list.size()-1),pos); 


     } 


    } 



    public static String compute(String input) 
    { 
     List<String> processedList = new ArrayList<String>(); 
     if (!input.isEmpty()) 
     { 
      String myRegex = "[^a-zA-Z]"; 
      StringTokenizer st = new StringTokenizer(input); 
      while (st.hasMoreTokens()) 
      { 
       processedList.add(st.nextToken()); 
       processedList.remove(myRegex); 
       processedList.remove("="); 

      } 
     } 
     else 
     { 
      return "Error"; 
     } 
     Stack<String> tempList = new Stack<String>(); 

     Iterator<String> iter = processedList.iterator(); 

     while (iter.hasNext()) 
      { 
       String temp = iter.next(); 
       if (temp.matches("[0-9]*")) 
        { 

        tempList.push(temp); 
        } 
        else if (temp.matches("[*-/+]")) 
        { 

         if (temp.equals("*")) 
         { 
          int rs = Integer.parseInt(tempList.pop()); 
          int ls = Integer.parseInt(tempList.pop()); 
          int result = ls * rs; 
          tempList.push("" + result); 
         } 
         else if (temp.equals("-")) 
         { 
          int rs = Integer.parseInt(tempList.pop()); 
          int ls = Integer.parseInt(tempList.pop()); 
          int result = ls - rs; 
          tempList.push("" + result); 
         } 
         else if (temp.equals("/")) 
         { 
          int rs = Integer.parseInt(tempList.pop()); 
          int ls = Integer.parseInt(tempList.pop()); 
          int result = ls/rs; 
          tempList.push("" + result); 
         } 
         else if (temp.equals("+")) 
         { 
          int rs = Integer.parseInt(tempList.pop()); 
          int ls = Integer.parseInt(tempList.pop()); 
          int result = ls + rs; 
          tempList.push("" + result); 
         } 

        } 
        else 
        { 
         return "Error"; 
        } 
      } 

     return tempList.pop(); 
    } 
} 

Кто-нибудь знает, как я могу сделать память hashMap на калькуляторе пост-исправления работающим там, где пользователь может назначать переменные и иметь возможность их перезвонить, или лучший способ приблизиться к этому?

+0

Что именно вы пытаетесь установить в hashmap? – ryekayo

+0

Я пытаюсь сохранить ответы пользователей. Пользователь может объявить свою собственную переменную вроде того, что я показал выше в формате «variable = value». Но я зациклился на том, как сделать эту работу. – Dayman

+1

Вам следует создать [MCVE] (http://stackoverflow.com/help/mcve). – StackFlowed

ответ

0

Ваша проблема в том, что вы добавляете «Ошибка» из предложения else в методе вычисления, а затем пытаетесь проанализировать его как int.

public static String compute(String input) 
{ 
    List<String> processedList = new ArrayList<String>(); 
    if (!input.isEmpty()) 
    { 
     String myRegex = "[^a-zA-Z]"; 
     StringTokenizer st = new StringTokenizer(input); 
     while (st.hasMoreTokens()) 
     { 
      processedList.add(st.nextToken()); 
      processedList.remove(myRegex); 
      processedList.remove("="); 

     } 
    } 
    else 
    { 
     return "Error"; //-->> problem 
    } 

Разбор его как инт. Это вычисление точки (a) не будет равно нулю, поскольку оно имеет «Ошибка». Следующий шаг, который вы пытаетесь проанализировать как int.

if (compute(a) != null) 
{ 
    pos = Integer.parseInt(compute(a)); 
} 

Вы можете изменить свой код как

if (compute(a) != null && !compute(a).equals("Error")) 
{ 
    pos = Integer.parseInt(compute(a)); 
} 

Кроме того, вы должны попробовать вы кладете Integer.parseInt() код в попытке поймать.

+0

Правильно, но моя программа возвращает ошибку, потому что я не смог найти способ удалить введенную пользователем переменную (так как я не знаю ее раньше), прежде чем она войдет в мою вычислительную функцию. – Dayman

+0

Все, что я говорю, не пытайтесь разобрать это на int. Когда вы пытаетесь сделать Integer.parseInt («Ошибка»); // -> Это вызывает исключение NumberFormatException. Который вы не хотите. – StackFlowed

+0

Хорошо, значит ли это, что я должен удалить возвращаемые ошибки и попытаться проанализировать переменную, чтобы сохранить ее в hashmap, а затем после вычисления моего вычисления сохраните результат в моем хэш-файле с моей переменной? – Dayman

0

Ваш HashMap может использоваться для хранения имен переменных и их значений. Ключом для карты будет имя переменной, а значение - назначенное ей число. В настоящее время у вас есть Integer, но вам может понадобиться то, что обрабатывает десятичные знаки, если вы собираетесь разрешать такие вещи, как a = 10 3 /.

В вашем методе compute(..) вы ожидаете, что вход будет формы var = <calculation>, так что вы должны сначала разобрать имя переменной, которая будет ключ, используемый в памяти HashMap, а после вычисления вычисления, хранения, которые являются результатом с memory.put(var,result);.

При вычислении части <calculation>, если встречается имя переменной, найдите ее значение, используя memory.get(var) и используйте это значение в вычислении. С помощью постфиксного калькулятора вам просто нужно получить 2 значения, затем выполнить операцию и выполнить математику. Результатом этого является первое значение следующей пары для работы и т. Д., Пока вы не закончите работу и, наконец, назначьте результат переменной.

+0

Хорошо, что имеет большой смысл! Значит ли это, что я должен избавиться от ошибок? – Dayman

+0

Вы всегда должны проверять наличие ошибок, чтобы, если кто-то вводит что-то недействительное, ваша программа делает что-то разумное. –