Любой простой способ Java для передачи частей хэш-карты в другую хэш-карту?

Для моей торговой программы объект Merchant имеет свойства HashMap перечислимых качеств с логическими значениями.

public class Merchants {
   private Map<Qualities, Boolean> qualities = new HashMap<Qualities, Boolean>();

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

Например, данный Торговец может иметь Рейтинг «1», связанный с его Истинным Качеством Биржевого Брокера.

Проблема в том, что Java не позволяет мне сделать это легко. Следующий код демонстрирует мои намерения, но не компилируется:

private Map<qualities-TRUE, Byte> ratedQualities = new HashMap<qualities-TRUE, Byte>();

В соответствии с этим текстом ссылки одно решение заключается в создании оболочки для качеств HashMap. Это единственное решение или есть лучший способ?

Заранее спасибо за помощь.


person Arvanem    schedule 19.04.2010    source источник
comment
Зачем вам нужно сопоставление с логическим значением? Разве вы не можете заменить это на карту, просто не содержащую запись для ключей, которые вы бы сопоставили с ложью?   -  person Thomas Lötzer    schedule 19.04.2010
comment
@Thomas Lotzer, я использую логическое сопоставление, чтобы определить, какие продавцы обладают несколькими качествами. Предполагая, что ваше предложение выполнимо, я попытаюсь в будущем заменить его картой, содержащей только верные записи.   -  person Arvanem    schedule 19.04.2010
comment
Следуя комментарию Томаса, если вы отказываетесь от ложных значений, замените тип значения на Integer, и тогда у вас будут как качества, так и их соответствующие скорости на одной карте.   -  person Eyal Schneider    schedule 19.04.2010
comment
@Eyal и Томас Лотцер, спасибо за ваши предложения. Это упрощает код.   -  person Arvanem    schedule 19.04.2010
comment
Я не совсем уверен, что вы хотите, но я предлагаю вам взглянуть на структуру Google Collections. У него есть класс Maps, который предоставляет несколько методов для фильтрации вашей карты на основе ключей, значений или чего-то еще. Он также содержит класс Multimap, который можно использовать для простого сопоставления более одного значения с ключом.   -  person Jorn    schedule 19.04.2010
comment
@Thomas Lötzer: НЕ знаю о регистре операций, но добавление true или false позволяет вам использовать случай без значения для указания неизвестного, то есть логическое значение, если логическое значение приемлемо, оператор может просто использовать Set как значение стал излишним.   -  person vickirk    schedule 19.04.2010


Ответы (3)


Вот реализация Merchant с использованием идей Томаса Лётцера и других.

class Merchant
{
    Map<Quality, Integer> ratings = new HashMap<Quality, Integer>();

    boolean hasQuality(Quality quality)
    {
        return ratings.containsKey(quality);
    }

    int getRatingOfQuality(Quality quality)
    {
        Integer rating = ratings.get(quality);
        return (rating != null) ? rating : 0;
    }

    void setRatingOfQuality(Quality quality, int rating)
    {
        ratings.put(quality, rating);
    }
}
person Matthew T. Staebler    schedule 19.04.2010
comment
Спасибо за вашу помощь. Я проголосовал за вас, Томаса, Эяля и Аарона, которые заслуживают похвалы за этот ответ. - person Arvanem; 19.04.2010

Есть ли проблема, которую я не вижу, просто перебирая записи qualities и добавляя их к пустому ratedQualities, если значение записи в qualities равно true?

Это был бы мой подход, если бы я правильно понял ваш вопрос.

person Patrick Bergner    schedule 19.04.2010
comment
Спасибо за Ваш ответ. Вы правы, что цикл может сделать это. Однако я надеялся, что есть простой способ инициализировать это, поскольку у меня есть множество классов, похожих на Merchants, с множеством похожих атрибутов, хранящихся в HashMaps. - person Arvanem; 19.04.2010

Я предлагаю заменить Boolean на карте qualities на Integer и рассматривать Boolean.FALSE как Integer.valueOf(0).

person Aaron Digulla    schedule 19.04.2010
comment
Спасибо за Ваш ответ. +1 для предложения Boolean.FALSE будет Integer.valueOf(0). - person Arvanem; 19.04.2010