2017-01-28 2 views
0

Используя Java, у меня есть набор исходных данных целых чисел, он большой, но не огромный - допустим, он не получит больше 30 000 значений.Вычисление зависимых значений в Java

Использование исходного набора данных У меня есть некоторые суммарные значения, которые я хочу создать (они специфичны для домена, а не то, что вы найдете в библиотеке, такой как Apache Math).

Существует взаимосвязь между значениями суммарных так:

[source data] -> summary1 -> summary2 -> summary3 
        \     ^
         \____________________| 

Я не хочу более-инженер решение, но я ожидать в будущем, что может быть дополнительные итоговые значения, которые будут строить на этом графике. В настоящее время мое решение предполагает наличие объекта домена, который имеет «getter» для каждой сводки и просто проверяет, был ли он уже вычислен, и вычисляет - сохраняет его, если это необходимо. Это отлично работает, но мне не нравится иметь всю эту вычислительную логику в моем доменном объекте.

Мне кажется, что это может быть представлено скорее как калькулятор с ключом>, где результаты хранятся на карте, а калькуляторы знают, какие «ключи» им нужны. Прежде чем я уйду и реализую что-то подобное, очень сложно представить, что кто-то еще этого не сделал (тысячу раз).

Может ли кто-нибудь посоветовать мне по идиомам или библиотекам, на которые стоит обратить внимание на такое проблемное пространство? Я знаком с такими вещами, как JGraph, но я не верю, что это позволит мне связать калькулятор на узле, он просто предоставит графическую модель. Возможно, это больше проблема для библиотеки кеширования?

+0

Я не совсем понимаю проблему, с которой вы сталкиваетесь, однако последняя версия Guava реализовала тип Graph, который я рекомендую изучить. –

+0

Спасибо, но я бы поместил график Guava в той же категории, что и JGraph, - он предоставляет структуру данных графа, а не кеширование/оценку графика, который мне нужен. – Scruffers

ответ

0

Идея key -> calculator выглядит как типичное приложение кэша загрузки (он же автонаселен, ака прочитан). Пример, чтобы сделать это с cache2k:

Cache<Key, Integer> summary1cache = new Cache2kBuilder<Key, Integer>() {} 
    .loader(this::calculateSummary1) 
    .build(); 

    int calculateSummary1(Key key) { 
    ... 
    } 

Для достижения наилучших результатов я рекомендую один кэш каждого суммарного типа. Руководство пользователя содержит дополнительную информацию о cache loaders/read through.

Вы можете сделать то же самое с другими кешами, например. Guava Cache или Caffeine.

Альтернативный образец Map.computeIfAbsent(key, function). Однако, если функция загрузчика известна с самого начала, я рекомендую настроить кеш с ней.

Отказ от ответственности: Я не знаю на 100%, является ли это наилучшим решением, поскольку из вопроса не ясно, сколько разных ключей/резюме вы получите и как выглядит шаблон доступа.

+0

Спасибо @cruftex. Я должен был уточнить; Я не думаю, что будет более 10 резюме. Шаблон доступа будет обновляться нечасто (базовые данные в значительной степени исправлены, хотя могут быть отредактированы в теории), чтение также будет низким - возможно, максимум 10/мин, как будет отображаться в пользовательском пользовательском интерфейсе. Для производительности здесь не нужен кеш, но шаблон ключа для калькулятора красиво разбивает график вычислений. – Scruffers

Смежные вопросы