Java Получить ключи HashMap в виде целочисленного массива - PullRequest
2 голосов
/ 14 сентября 2011

У меня есть такая хеш-карта

public HashMap <String,People> valueHashMap  = new Hashmap();

Здесь ключом к моей HashMap является время в секундах в виде строки, т.е. я добавляю значение в хэш-карту, как это

long timeSinceEpoch = System.currentTimeMillis()/1000;
valueHashMap.put(
                   Integer.toString((int)timeSinceEpoch)
                   , people_obj
                );

СейчасЯ хочу получить все ключи в hashmap в массив целых чисел.

ArrayList<Integer> intKeys = valueHashMap.keys()...

Есть ли способ сделать это?

Ответы [ 4 ]

11 голосов
/ 14 сентября 2011

Нет прямого способа преобразования списка String s в список Integer s:

  1. Либо вам нужно переопределить ваш valueHashMap следующим образом:

    public HashMap<Integer, People> valueHashMap  = new HashMap<Integer, People>();
    
    ....
    
    ArrayList<Integer> intKeys = new ArrayList<Integer>(valueHashMap.keySet());
    
  2. Или вам нужно выполнить цикл:

    ArrayList<Integer> intKeys = new ArraList<Integer>();
    
    for (String stringKey : valueHashMap.keySet())
         intKeys.add(Integer.parseInt(stringKey);
    
  3. Однако я бы посоветовал вам использовать Long в качестве ключа вместо :

    public HashMap<Long, People> valueHashMap  = new HashMap<Long, People>();
    

    тогда не будет приведения к int (и вы можете использовать (1) выше вместо Long)

1 голос
/ 14 сентября 2011

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

for(String k : valueHashMap.keySet()) {
    intKeys.add(Integer.valueOf(k));
}
0 голосов
/ 14 сентября 2011

Для этого можно использовать org.apache.commons.collections.Transformer класс следующим образом.

List<Integer> intKeys  = (List<Integer>)CollectionUtils.collect(valueHashMap.keySet(), new Transformer() {
                                    @Override
                                    public Object transform(Object key) {
                                        return Integer.valueOf(key);
                                    }
                                }, new ArrayList<Integer>());
0 голосов
/ 14 сентября 2011

У вас действительно есть проблемы с типом.Почему вы меняете длинные строки на строки, чтобы хранить их на карте.Почему бы просто не использовать Long, который требует меньше памяти и является более наглядным.Тогда зачем использовать Integer.toString для преобразования long в String?Приведя свой длинный к int, вы рискуете потерять информацию.Вот как должен выглядеть код:

private Map<Long, People> valueHashMap = new Hashmap<Long, People>();

long timeSinceEpoch = System.currentTimeMillis()/1000;
valueHashMap.put(timeSinceEpoch, people_obj);
List<Long> longKeys = new ArrayList<Long>(valueHashMap.keySet());
...