Арифметические операции динамически для метода в Android?

#java #math #collections #hashmap #operators

#java #математика #Коллекции #hashmap #операторы

Вопрос:

Я хочу выполнять арифметические операции (только сложения и вычитания) динамически, у меня есть json, который включает в себя операцию, подобную приведенной ниже «операция»: «a b» это ключевое значение — моя операция, и это динамически означает, что оно также будет выглядеть как «операция»: «a b d-c e» но один уверен, что это будет происходить только с добавлениями и вычитанием

и мои значения находятся в Hashmap, как

 HashMap<String,String> map = new HashMap<String,String>();
map.put("a", "10");
map.put("b", "10");
map.put("c", "5");
map.put("d", "5");
map.put("e", "15");


[
    {
        "id": 15,
        "lable": "C__a_plus_b",
        "field": "b",
        "operator": "None",
        "inputType": "Number",
        "ids": "13",
        "operation": "a b",
        "operations": "true"
    },
    {
        "id": 19,
        "lable": "F__c_plus_d",
        "field": "d",
        "operator": "None",
        "inputType": "Number",
        "ids": "17",
        "operation": "C__a_plus_b d",
        "operations": "true"
    },
    {
        "id": 21,
        "lable": "d_c_f",
        "field": "F__c_plus_d",
        "operator": "None",
        "inputType": "Number",
        "ids": "19",
        "operation": "d C__a_plus_b-F__c_plus_d",
        "operations": "true"
    }
]
  

Ответ №1:

То, что вы собираетесь реализовать, называется интерпретатором. Интерпретатор — это программа, которая имитирует компьютер. Первое, что вам нужно подумать о компьютере, будь то реализованный в аппаратном или программном обеспечении, — это набор инструкций. Прочитайте некоторую литературу об этом, чтобы узнать, какие типы наборов инструкций существуют.

Затем, глядя на предоставленный вами образец входного кода, я должен признать, что это очень плохой формат набора инструкций. В хорошем наборе команд каждая команда имеет отдельные поля для операндов и кода операции. Здесь мы можем видеть, что только один операнд предоставляется в виде поля структуры данных инструкции («field»: «b» в первой инструкции) и поэтому бесполезен, поле «operator» всегда говорит «None», а также бесполезно, и вся информация должна быть извлечена из поля «операция», значением которой является текст. Итак, вам также необходимо реализовать синтаксический анализатор, который, учитывая входную строку like "d C__a_plus_b-F__c_plus_d" , возвращает структуру данных, подобную этой:

 {"operator":"-",
 "leftOperand":
    {"operator:" ",
     "leftOperand":"d",
     "rightOperand":"C__a_plus_b"
    },
 "rightOperand":"F__c_plus_d"
}
  

Я использовал представление JSON / Javasript, но оно может быть представлено на любом языке программирования, например, Java.

Тема о том, как реализовать синтаксические анализаторы, описана в другом месте, и я не буду объяснять это здесь.

Фактически, вместо создания структуры данных анализатор может немедленно вычислить и вернуть значение входного выражения — я только подчеркиваю, что это все еще анализатор, а не интерпретатор.