Помочь сопоставить поля между двумя классами - PullRequest
1 голос
/ 03 апреля 2010

Я еще не слишком разбираюсь в Java, и я надеюсь, что кто-то может направить меня в правильном направлении, потому что сейчас я чувствую, что просто бью себя головой об стену ...

Первый класс называется MeasuredParams и имеет более 40 числовых полей (рост, вес, талия, размер запястья - некоторые целые, но в основном двойные). Второй класс - это статистический классификатор под названием Classifier. Он был обучен на подмножестве полей MeasuredParams. Имена полей, на которых обучен Классификатор, по порядку хранятся в массиве с именем reqdFields.

Что мне нужно сделать, это загрузить новый массив toClassify со значениями, хранящимися в полях из MeasuredParams, которые соответствуют списку полей (включая порядок), найденному в reqdFields. Я могу внести любые необходимые изменения в класс MeasuredParams, но я застрял с классификатором как есть.

Мой метод грубой силы состоял в том, чтобы избавиться от полей в MeasuredParams и использовать вместо него arrayList и сохранить имена полей в объекте Enum, чтобы он действовал как указатель индекса. Затем выполните цикл по списку reqdFields, по одному элементу за раз, и найдите соответствующее имя в объекте Enum, чтобы найти правильную позицию в arrayList. Загрузите значение, хранящееся в этой позиции, в toClassify, а затем перейдите к следующему элементу в reqdFields.

Я не уверен, как именно я буду искать через объект Enum - было бы намного проще, если бы имена полей были сохранены во втором arrayList. Но тогда позиции индекса между ними должны были остаться согласованными, и я вернулся к использованию Enum. Я думаю. Я бегал кругами весь день, и я продолжаю думать, что должен быть более простой способ сделать это. Я просто застрял прямо сейчас и не могу понять, что я начал.

Любая помощь будет принята с благодарностью. Большое спасибо!

Michael

Ответы [ 2 ]

3 голосов
/ 03 апреля 2010

Возможно, вам лучше использовать карту, а не список, вы можете использовать enum в качестве ключа и получить значения.

Map<YourEnumType,ValueType> map = new HashMap<YourEnumType,ValueType>();
1 голос
/ 03 апреля 2010

@ Том рекомендует использовать Map - предпочтительный подход. Вот тривиальный пример, который создает такой Map для использования статическим lookup() методом.

private enum Season {

    WINTER, SPRING, SUMMER, FALL;
    private static Map<String, Season> map = new HashMap<String, Season>();
    static {
        for (Season s : Season.values()) {
            map.put(s.name(), s);
        }
    }

    public static Season lookup(String name) {
        return map.get(name);
    }
}

Обратите внимание, что каждый тип enum имеет два неявно объявленных статических метода :

public static E[] values();
public static E valueOf(String name);

Метод values() возвращает массив, который удобен для построения Map. В качестве альтернативы, массив можно искать напрямую. Методы неявные; они появятся в javadoc вашего enum при его создании.

Приложение: Как предлагает @Bert F, EnumMap может быть выгодным. См. Effective Java Second Edition , Элемент 33: Используйте EnumMap вместо порядкового индексирования , для убедительного примера использования EnumMap ассоциированный enum с.

...