Печать одного ключа с несколькими значениями из HashMap - PullRequest
0 голосов
/ 03 мая 2018

Я создал Hashmap, в котором символ акции хранится в качестве ключа, а ETF, связанные с символом акции, в качестве значений. единственное, что я сейчас пытаюсь выяснить, это как распечатать то, что было сохранено в HashMap. Я пробовал разные способы, которые либо дают мне тарабарщину, либо исключение NullPointException. Ниже приведен мой код и различные способы печати HashMap:

public static void main(String[] args){

        Map<TickerSymbol, List<ETF>> exampleMap = new HashMap<>();

        // create list one and store values
        List<ETF> setOne = new ArrayList<>();
        setOne.add(new ETF("Number 1", .2, .3, .4, .5, .6));
        setOne.add(new ETF("Number 2", .241, .312, .4312, .5423, .642));
        setOne.add(new ETF("Number 3", .21, .31, .41, .51, .61));    

        // create list two and store values
        List<ETF> setTwo = new ArrayList<>();
        setTwo.add(new ETF("Number 4", .3, .4, .5, .6, .8));
        setTwo.add(new ETF("Number 5", .3524, .442, .542, .665, .80));
        setTwo.add(new ETF("Number 6", .23, .32, .43, .76, .89));

        // create list three and store values
        List<ETF> setThree = new ArrayList<>();
        setThree.add(new ETF("Number 7", .37, .47, .57, .68, .89));
        setThree.add(new ETF("Number 8", .38, .48, .58, .68, .89));
        setThree.add(new ETF("Number 9", .39, .49, .59, .68, .89));

        // put values into map
        exampleMap.put(new TickerSymbol("stockA"), setOne);
        exampleMap.put(new TickerSymbol("stockB"), setTwo);
        exampleMap.put(new TickerSymbol("stockC"), setThree);    


        //gibberish prints out with this one
        for (Map.Entry<TickerSymbol, List<ETF>> entry : exampleMap.entrySet()) {
            TickerSymbol key = entry.getKey();
            List<ETF> values = entry.getValue();
            System.out.println("Key = " + key);
            System.out.println("Values = " + values + "n");
        }


        //gibberish prints out with this one
        for (Map.Entry<TickerSymbol, List<ETF>> entry : exampleMap.entrySet()) {
            System.out.println(entry.getKey() + ":" + entry.getValue().toString());
        }


        //gibberish prints out with this one
        exampleMap.forEach((key, value) -> System.out.println(key + ":" + value));
        System.out.println(exampleMap.keySet().toString());

        //I get a null pointer exception with this one
        Iterator iterator = exampleMap.keySet().iterator();

        while (iterator.hasNext()) {
            String key = iterator.next().toString();
            String value = exampleMap.get(key).toString();

            System.out.println(key + " " + value);
        }

    }

Действительно надеюсь, что кто-то может помочь мне здесь ... У меня нет идей.

1 Ответ

0 голосов
/ 05 мая 2018

Наблюдаемая вами тарабарщина является результатом toString() из ArrayList (реализовано в AbstractCollection). Он вызывает toString() для каждого сохраненного элемента. В вашем случае эти элементы являются экземплярами ETF. Если вы не переписываете toString() в ETF, он наследует реализацию от Object, а именно:

public String toString() {
    return getClass().getName() + "@" + Integer.toHexString(hashCode());
}

Поэтому добавьте метод toString() в ETF, например,

@Override
public String toString() {
    return number + " (" + floats + ")";
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...