У меня есть некоторые данные JSON, которые я хочу сопоставить с определенным массивом идентификаторов. Так, например, JSON temperature: 80, weather: tornado
может сопоставляться с массивом идентификаторов [15, 1, 82]
. Этот массив идентификаторов является совершенно произвольным, и я сам определю его для этого конкретного ввода, он просто предназначен для предоставления рекомендаций на основе условий.
Таким образом, хотя temperature
>= 80 в tornado
условиях всегда соответствует [15, 1, 82]
, та же температура в cloudy
условиях может быть [1, 16, 28]
и так далее.
Проблема в том, что существует МНОГО потенциальных «ветвей». В моей программе есть 7 времен суток, каждый из этих time of day
узлов имеет 7 потенциальных температурных диапазонов, и каждый из этих temperature range
узлов имеет 15 возможных погодных явлений. Так что вручную писать операторы if
для 735 комбинаций (если я правильно посчитал) было бы очень неуправляемо.
Я нарисовал «дерево решений», представляющее один путь для демонстрационных целей выше.
Каковы некоторые рекомендуемые способы представления этого в коде, помимо массово вложенных условных операторов/операторов case?
Спасибо.
@trincot исходные данные представляют собой объект JSON с температурой и временем. Таким образом, «дерево решений» является чисто теоретическим, мне пришлось бы сначала построить/заполнить структуру данных, а затем использовать ее для поиска.
Но тогда откуда взять список идентификаторов и их отношение к этим ключам?
В моем случае список идентификаторов определяется вручную и произвольно. Например, температура 90 градусов и погода "торнадо" сами по себе приведут к определенному списку идентификаторов [1, 2, 3], которые я определил (которые используются для других целей). Тем не менее, есть много совпадений, так как температура 90 градусов и погода «шквала» могут привести к списку идентификаторов [2, 3, 19] и т. д. Итак, моя проблема — это большое дерево решений для ввода — но, как я сказал, не уверен, если я слишком много думаю
Это довольно расплывчато. Можете ли вы отредактировать свой вопрос и предоставить код того, как делается ввод и что вы ожидаете на выходе? Я сомневаюсь, что вы действительно имеете дело с деревом решений. Какое здесь будет решение?
Рассмотрим DAG для представления ваших данных. Используйте универсальный код для навигации. Я имею в виду, не пытайтесь вставлять данные в код. Небольшой универсальный код и большой DAG для хранения деталей.
@trincot конечно, снова обновил. Надеюсь, теперь это намного менее расплывчато. Ваше здоровье.
Нет необходимости в массовом ветвлении. Достаточно просто создать справочную таблицу с 735 возможными записями. Вы сказали, что сами добавите значения.
Создавайте перечисления для каждого времени суток, температурных диапазонов и погодных явлений. Таким образом, ваше время суток отображается от 0 до 6, ваши диапазоны температуры отображаются от 0 до 6, а ваши погодные события отображаются от 0 до 14. По сути, у вас есть трехмерный массив. И каждая запись в массиве представляет собой список списков идентификаторов.
В C# это будет выглядеть примерно так:
List<List<int>>[][][] = LookupTable[7][7][15];
Чтобы заполнить таблицу поиска, напишите программу, генерирующую JSON, которую вы можете включить в свою программу. В псевдокоде:
for (i = 0 to 6) { // loop for time of day
for (i = 0 to 6) { // loop for temperature ranges
for (i = 0 to 14) { // loop for weather events
// here, output JSON for the record
// You'll probably want a comment with each record
// to say which combination it's for.
// The JSON here is basically just the list of
// ID lists that you want to assign.
}
}
}
Возможно, вы захотите использовать эту программу для создания скелета JSON (т. е. одной записи для каждой комбинации [время суток, температура, погодное событие]), а затем вручную добавить список списков идентификаторов.
Это небольшая подготовка, но, в конце концов, ваш поиск предельно прост: преобразуйте время суток, температуру и погодное событие в соответствующие целочисленные значения и найдите их в массиве. Всего несколько строк кода.
Вы можете сделать что-то подобное с картой или словарем. Вы бы сгенерировали JSON, как указано выше, но вместо того, чтобы загружать его в трехмерный массив, загрузите его в свой словарь с ключом, представляющим собой конкатенацию трех измерений. Например, ключ будет:
"early morning,lukewarm,squall"
Вероятно, есть и другие решения для таблицы поиска. Это первые два, которые я придумал. Дело в том, что у вас есть много статических данных, которые очень удобно индексировать. Воспользуйтесь этим.
Отличная идея, матричная структура не приходила мне в голову. Спасибо!
Каков исходный формат данных?