Заполнение HashMaps из HashMap объектов - PullRequest
0 голосов
/ 12 марта 2012

У меня есть код, над которым я работаю, но у меня проблемы с заполнением HashMap из HashMaps. Декларация идет так:

HashMap<Games, HashMap<Store, Integer>> myMap = new HashMap<Games, HashMap<Store,   Integer>>();

Где Game и Store - это отдельные классы объектов, имеющие только заголовок переменной класса.

Как создать экземпляры объектов в HashMaps, а также заполнить две хеш-карты. Потому что мне нужно пометить целое число в игре в конкретном магазине. В то время как в каждом магазине есть разные магазины и разные игры.

Заранее спасибо

Редактировать

Класс игр

package gameStore;

public class Games {
    private String title;

    public Games(String inTitle){
        setTitle(inTitle);
    }
    private String getTitle() {
        return title;
    }
    private void setTitle(String title) {
        this.title = title;
    }
}

Класс магазинов

package gameStore;

public class LocalStores {
    private String nameOfStore;

    public LocalStores(String inNameOfStore){
        setNameOfStore(inNameOfStore);
    }
    private void setNameOfStore(String nameOfStore){
        this.nameOfStore = nameOfStore;
    }
}

1 Ответ

3 голосов
/ 12 марта 2012

Я бы сделал что-то вроде этого:

void addToMap(Games games, Store store, int value) {
    HashMap<Store,Integer> m = myMap.get(games);
    if (m == null) {
        m = new HashMap<Store,Integer>();
        myMap.put(games, m);
    }
    m.put(store, value);
}

UPDATE:

Поскольку игры и Магазин используются в качестве ключей для HashMap, я рекомендую добавить методы hashCode и equals:

Игры:

public int hashCode() {
    return title.hashCode();
}

public boolean equals(Object obj) {
    if (!(obj instanceof Games)) {
        return false;
    }
    Games other = (Games)obj;
    return title.equals(other.title);
}

LocalStores:

public int hashCode() {
    return nameOfStore.hashCode();
}

public boolean equals(Object obj) {
    if (!(obj instanceof LocalStores)) {
        return false;
    }
    LocalStores other = (LocalStores)obj;
    return nameOfStore.equals(other.nameOfStore);
}

Теперь, для простоты, допустим, что каждая строка вашего входного файла содержит три поля, разделенных вкладками: название игры, название магазина и целочисленное значение. Вы бы прочитали это следующим образом:

InputStream stream = new FileInputStream("myfile");
try {
    Reader reader = new InputStreamReader(stream, "UTF-8"); // or another encoding
    try {
        BufferedInputStream in = new BufferedInputStream(reader);
        try {
            String line = in.readLine();
            while (line != null) {
                String[] fields = line.split("[\\t]");
                if (fields.length == 3) {
                    addToMap(new Games(fields[0]), new LocalStores(fields[1]), Integer.parseInt(fields[2]));
                }
                line = in.readLine();
            }
        } finally {
            in.close();
        }
    } finally {
        reader.close();
    }
} finally {
    stream.close();
}
...