Проблема с хэш-картой в Java - PullRequest
1 голос
/ 02 февраля 2011

Я хотел бы спросить

в Hashmap

как мне подсчитать все числа, если идентификатор элемента одинаковый?

Может ли кто-нибудь дать мне идею?

Или просто дайте мне несколько полезных справочных ссылок для изучения

спасибо

import java.util.*;
import java.util.Iterator;

public class hash {

    public static void main(String[] args) {

        HashMap hashMap = new HashMap();
        hashMap.put("ABS", new Double(3434.34));
        hashMap.put("ABD", new Double(123.22));
        hashMap.put("ABD", new Double(123.22));
        hashMap.put("ABD", new Double(123.22));
        hashMap.put("ABD", new Double(123.22));

        Set set = hashMap.entrySet();

        Iterator i = set.iterator();
        while (i.hasNext()) {
            Map.Entry me = (Map.Entry) i.next();
            System.out.println(me.getKey() + " : " + me.getValue());
        }


    }
}

Ответы [ 5 ]

5 голосов
/ 02 февраля 2011

Вы не можете.Вам нужна структура данных, которая поддерживает подсчет ключей.Реализации карт этого не делают.

Гуава

Можно использовать только одну вещь: Гуава * Мультикарта

Пример кода:

final Multimap<String, Double> map =
    Multimaps.newListMultimap(
        Maps.<String, Collection<Double>>newTreeMap(),
        new Supplier<List<Double>>(){

            @Override
            public List<Double> get() {
                return Lists.newArrayList();
            }});
map.put("ABS", Double.valueOf(3434.34));
map.put("ABD", Double.valueOf(123.22));
map.put("ABD", Double.valueOf(123.22));
map.put("ABD", Double.valueOf(123.22));
map.put("ABD", Double.valueOf(123.22));
for (final Multiset.Entry<String> key : map.keys().entrySet()) {
    System.out.println(
        "Key: "
        +key.getElement()
        +", count: "
        +key.getCount()
        +", values: "
        +map.get(key.getElement())
    );
}

Выход:

Ключ: ABD, счетчик: 4, значения: [123.22, 123.22, 123.22, 123.22]
Ключ: ABS, количество: 1, значения: [3434.34]

MultiMap в Apache Commons / Collections также поможет.


Обычная Java

Если вам не разрешено использовать внешнюю библиотеку, вы все равно можете реализовать эту функцию с помощью Map<String, List<Double>>.Создайте метод, подобный этому

Метод помощника

public static <K, V> void assignValue(
    final Map<K, Collection<V>> map, final K key, final V value) {

    Collection<V> values = map.get(key);
    if(values==null){
        values=new ArrayList<V>();
        map.put(key, values);
    }
    values.add(value);
}

Использование

И используйте его следующим образом:

final Map<String, Collection<Double>> map =
    new HashMap<String, Collection<Double>>();
assignValue(map, "ABS", Double.valueOf(3434.34));
assignValue(map, "ABD", Double.valueOf(123.22));
assignValue(map, "ABD", Double.valueOf(123.22));
assignValue(map, "ABD", Double.valueOf(123.22));
assignValue(map, "ABD", Double.valueOf(123.22));

for(final Entry<String, Collection<Double>> entry : map.entrySet()){
    System.out.println(new StringBuilder()
        .append("Key: ")
        .append(entry.getKey())
        .append(", count: ")
        .append(entry.getValue().size())
        .append(", values: ")
        .append(entry.getValue())
        .toString());
}

Выход

Ключ: ABD, счет: 4, значения: [123.22, 123.22, 123.22, 123.22]
Ключ: ABS, счет:1, значения: [3434,34]

1 голос
/ 02 февраля 2011

Прочитайте это , особенно метод "пут", который говорит:

Связывает указанное значение с указанным ключом на этой карте. Если карта ранее содержала сопоставление для этого ключа, старое значение заменяется.

То, как вы структурировали свой код, означает, что HashMap будет содержать только две пары ключ / значение.

public class hash {

public static void main(String[] args) {

    HashMap hashMap = new HashMap();
    hashMap.put("ABS", new Double(3434.34)); // "ABS" key created. 1 object in map.
    hashMap.put("ABD", new Double(123.22)); // "ABD" key created. 2 objects in map.
    hashMap.put("ABD", new Double(123.22)); // "ABD" reference will point to new value.
    hashMap.put("ABD", new Double(123.22)); // .. and again
    hashMap.put("ABD", new Double(123.22)); // .. and again

Итак, пока вы написали пять строк, в HashMap будут помещены только два объекта.

Вы можете использовать

hashMap.size()

для возврата значения int из числа пар ключ / значение в hashMap.

1 голос
/ 02 февраля 2011

HashMap is-a Карта , которая не может содержать дубликаты ключей.Если допустимы повторяющиеся ключи, какое значение вы ожидаете получить при вызове map.get(duplicateKey)?

0 голосов
/ 02 февраля 2011

size = hashMap.size(); затем используйте цикл для итерации

0 голосов
/ 02 февраля 2011

, поэтому вам нужно использовать Double + Count в качестве значения и использовать его вместо Double, в качестве упражнения он расширяет java.lang.Number:)

Class DoubleCount{
  final double value;
  private int count;
  DoubleCount(double value){
    this.value = value;
  }
  public int getCount(){
    return count;
  } 

  public double getValue(){
   return value;
  }

  public int incCount(){
    return ++count;
  } 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...