HashMap ставить или ставить все? - Джава - PullRequest
0 голосов
/ 15 декабря 2011

Помещение хэш-карт по ссылке и копирование хэш-карт. Как мне сделать последнее? Другая проблема заключается в том, что число String[] types на самом деле не известно заранее, поэтому создание нескольких экземпляров Multiset<String> textAndCount = TreeMultiset.create(); не очень полезно. У меня следующий код, но мой вывод для обоих типов одинаков.

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;

import com.google.common.collect.Multiset;
import com.google.common.collect.TreeMultiset;


public class TestIterator {

private static String[] foobarness  = {"foo", "bar", "ness", "foo", "bar", "foo", "ness", "bar", "foo", "ness", "foo", "bar", "foo", "ness", "bar", "ness", "foo", "bar", "foo", "ness"};

private static String[] foobarness2  = {"bar", "ness", "foo", "bar", "foo", "ness", "bar", "foo", "ness", "foo", "foo", "bar", "foo", "ness", "bar", "foo", "ness", "bar", "foo", "ness", "ness", "bar", "foo", "ness"};

private static String[] types = {"type::1", "type::2"};


public static void main(String[] args) {
    Map<String, Multiset<String>> typeTextCount = 
        new HashMap<String, Multiset<String>>();

    Multiset<String> textAndCount = TreeMultiset.create();
    for (int i = 0; i < types.length; i++) {
        if ("type::1".equals(types[i])) {
            for (String text : foobarness)
                textAndCount.add(text, 1);
        }
        if ("type::2".equals(types[i])) {
            for (String text : foobarness2) 
                textAndCount.add(text, 1);
        }
        typeTextCount.put(types[i], textAndCount);
    }

    Iterator<Entry<String, Multiset<String>>> itTTC = 
        typeTextCount.entrySet().iterator();

    while (itTTC.hasNext()) {
        Map.Entry textCt = (Map.Entry) itTTC.next();
        System.out.println(textCt.getKey() + " :\t" + textCt.getValue());
        itTTC.remove();
    }
}

Мои выводы из вышеприведенного кода:

type::2 :   [bar x 13, foo x 17, ness x 14]
type::1 :   [bar x 13, foo x 17, ness x 14]

Правильные выходы должны быть:

type::1 :   [bar x 6, foo x 8, ness x 6]
type::2 :   [bar x 7, foo x 9, ness x 8]

Ответы [ 2 ]

4 голосов
/ 15 декабря 2011

Перемещение Multiset<String> textAndCount = TreeMultiset.create() внутри вашего цикла for.Этот один и тот же мультимножество совместно используется обоими «типами», поэтому ваши значения удваиваются.

Ваш цикл for может выглядеть так:

    for (int i = 0; i < types.length; i++) {
        Multiset<String> textAndCount = TreeMultiset.create();
        if ("type::1".equals(types[i])) {
            for (String text : foobarness)
                textAndCount.add(text, 1);
        }
        if ("type::2".equals(types[i])) {
            for (String text : foobarness2)
                textAndCount.add(text, 1);
        }
        typeTextCount.put(types[i], textAndCount);
    }

Пока вы на нем,Вы также можете улучшить итерацию карты, используя цикл для каждого стиля.Если вы заинтересованы в удалении каждой записи во время итерации по ней, вы можете заключить свой набор записей в consumingIterable для той же функциональности.

    for (Entry<String, Multiset<String>> textCt : Iterables.consumingIterable(typeTextCount
            .entrySet())) {
        System.out.println(textCt.getKey() + " :\t" + textCt.getValue());
    }

В результате вы получите:

type::2 :   [bar x 7, foo x 9, ness x 8]
type::1 :   [bar x 6, foo x 8, ness x 6]

Если вам не нравится этот порядок, я бы предложил использовать Ordering, чтобы получить отсортированный список ваших записей.

0 голосов
/ 15 декабря 2011

Multiset<String> textAndCount = TreeMultiset.create(); должно быть внутри цикла. Если вы поставите копию набора, результат будет

type::1 :   [bar x 6, foo x 8, ness x 6]
type::2 :   [bar x 13, foo x 17, ness x 14]
...