Дизайн класса Java для поддержки многозначных опций - PullRequest
0 голосов
/ 05 августа 2011

Ниже приведены некоторые коды:

ENJOY08A,
AUTO09B,
PLAY06D,
SUMMER08W,
WINTER03S,
LEAF02A,

Каждое из этих значений соответствует определенной области. Например, ENJOY08A и AUTO09B соответствуют DEPT_A

PLAY06D соответствует DEPT_B

SUMMER08W, WINTER03S и LEAF02A соответствует DEPT_C

Существует фиксированное количество областей (5 областей), но неограниченное количество кодов. Код будет соответствовать только одной области, но область может иметь любое количество кодов.

Ничего из перечисленного не будет сохранено в базе данных.

Мне нужно создать класс Java, который будет поддерживать следующие операции. Учитывая код, мне нужно знать соответствующую область. Учитывая район, мне нужно знать все соответствующие коды.

Как лучше всего разработать класс Java?

Ответы [ 5 ]

2 голосов
/ 05 августа 2011

Проверьте гуаву мультикарту .Я полагаю, что это обеспечивает функциональность, которую вы хотите.

0 голосов
/ 05 августа 2011

Я бы использовал класс с двумя Maps.

Первый - это Map<String, Set<String>> для поиска набора (или List) кодов для данной области. Кто-то также предложил Guava MultiMap, по сути, это то, что это такое.

Второй будет Map<String, String> для поиска области любого заданного кода.

Затем просто реализуйте соответствующие методы String findAreaForCode(String code) и Set<String> listCodesInArea(String area).

Наконец, если список областей мал, конечен и относительно статичен (не требует динамического роста во время выполнения), тогда я рассмотрел бы использование Java enum вместо обычного String.

0 голосов
/ 05 августа 2011
  1. Используйте MultiMap (библиотека гуавы Google), которая является двунаправленной картой, в качестве бэкэнда.
  2. Заполните карту обычными путами, либо во время строительства, либо из файла свойств, используя Java Properties class
  3. Предлагайте два метода интерфейса: regionForCode(String code) и codeForRegion(String region), которые используютBiMap для извлечения сопоставленных значений.

Вы можете даже рассмотреть возможность помещения региона в enum вместо простого String, потому что значения вашего региона фиксированы.Тогда домен будет описан более последовательно.

Отредактировано: я заметил, что BiMap предназначен для уникальных отображений.Ансер с MultiMap правильный, поэтому я исправил свой ответ.

0 голосов
/ 05 августа 2011

Я думаю, что самый простой способ - поместить ОБЛАСТИ в <String, Set> HashMap, а затем ввести все связанные КОДЫ на соответствующую карту. Затем вы можете получить Набор всех кодов для области или перебрать наборы, чтобы найти, какой из них содержит код, который вы ищете.

for (String k : (Set<String>)areas.keySet()) {
 if (areas.get(k).contains(theCode))
  return k;
}
return "NO CORRESPONDING AREA FOUND";
0 голосов
/ 05 августа 2011

Поскольку количество кодов не ограничено, вам нужно придумать правило для отображения кодов в отделах. Вероятно, это будет что-то вроде сложения всех кодов и получения этой суммы по модулю 5. Существует множество вариантов выбора этого правила.

Что-то вроде

public class DepartmentCoder {

    public static String toCode(Department department) {
        // TODO: Randomly generate a string having the desired property, such
        // as the sum of the string's codepoint modulo the number of departments
        // equaling the ordinal value of the department.       
    }

    public static Department(String code) {
        // TODO: Do some math on the codepoints of the string
        return result % Deparatments.NUMBER_OF_DEPARTMENTS;
    }
}

Я думаю, однако, что понятие «код» (в отличие от сжатия или шифрования) заключается в том, что значения кода являются фиксированными. Любое решение на основе правил может быть найдено легче.

...