#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.
Тема о том, как реализовать синтаксические анализаторы, описана в другом месте, и я не буду объяснять это здесь.
Фактически, вместо создания структуры данных анализатор может немедленно вычислить и вернуть значение входного выражения — я только подчеркиваю, что это все еще анализатор, а не интерпретатор.