как получить одну запись от hashmap без итерации

Создать пользовательское исключение для тестирования? Тогда Вы могли добавить любые пользовательские свойства, на которых Вы хотите, чтобы исключение несло с ним, он - путь посредством обработки исключений / регистрирующий процесс...

 [Serializable]
 public class TestException: ApplicationException
 {
     public TestException(string Message, 
                  Exception innerException): base(Message,innerException) {}
     public TestException(string Message) : base(Message) {}
     public TestException() {}

     #region Serializeable Code
     public TestException(SerializationInfo info, 
           StreamingContext context): base(info, context) { }
     #endregion Serializeable Code
 }

в Вашем классе

 try
 {  
      throw new TestException();
 }
 catch( TestException eX)
 {  
    LogHelper.Error("TEST EXCEPTION", eX);
 }
164
задан nilesh 2 October 2009 в 13:59
поделиться

8 ответов

Ответ Джеспера хороший. Другое решение - использовать TreeMap (вы запросили другие структуры данных).

TreeMap<String, String> myMap = new TreeMap<String, String>();
String first = myMap.firstEntry().getValue();
String firstOther = myMap.get(myMap.firstKey());

TreeMap имеет накладные расходы, поэтому HashMap работает быстрее, но это просто как пример альтернативного решения.

91
ответ дан 23 November 2019 в 21:12
поделиться

Карты не упорядочены, поэтому не существует такого понятия, как «первая запись», и именно поэтому нет метода получения по индексу на Map ( или HashMap ).

Вы можете сделать это:

Map<String, String> map = ...;  // wherever you get this from

// Get the first entry that the iterator returns
Map.Entry<String, String> entry = map.entrySet().iterator().next();

(Примечание: проверка наличия пустой карты пропущена).

Ваш код не получает все записи на карте, он возвращает немедленно (и выходит из цикла) с первой найденной записью.

Чтобы распечатать ключ и значение этого первого элемента:

System.out.println("Key: "+entry.getKey()+", Value: "+entry.getValue());

Примечание: вызов iterator () не означает, что вы повторяются по всей карте.

246
ответ дан 23 November 2019 в 21:12
поделиться

Думаю, итератор может быть самым простым решением.

return hashMapObject.entrySet().iterator().next();

Другое решение (не очень красивое):

return new ArrayList(hashMapObject.entrySet()).get(0);

Или еще (не лучше):

return hashMapObject.entrySet().toArray()[0];
28
ответ дан 23 November 2019 в 21:12
поделиться

Почему вы не хотите вызывать entrySet () , он не обычно создает совершенно новый объект со своим собственным контекстом, а вместо этого просто предоставляет фасадный объект. Проще говоря, entrySet () - довольно дешевая операция.

8
ответ дан 23 November 2019 в 21:12
поделиться

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

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@SuppressWarnings("unchecked")
public class IndexedMap extends HashMap {

    private List<Object> keyIndex;

    public IndexedMap() {
        keyIndex = new ArrayList<Object>();
    }

    /**
     * Returns the key at the specified position in this Map's keyIndex.
     * 
     * @param index
     *            index of the element to return
     * @return the element at the specified position in this list
     * @throws IndexOutOfBoundsException
     *             if the index is out of range (index < 0 || index >= size())
     */
    public Object get(int index) {
        return keyIndex.get(index);
    }

    @Override
    public Object put(Object key, Object value) {

        addKeyToIndex(key);
        return super.put(key, value);
    }

    @Override
    public void putAll(Map source) {

        for (Object key : source.keySet()) {
            addKeyToIndex(key);
        }
        super.putAll(source);
    }

    private void addKeyToIndex(Object key) {

        if (!keyIndex.contains(key)) {
            keyIndex.add(key);
        }
    }

    @Override
    public Object remove(Object key) {

        keyIndex.remove(key);
        return super.remove(key);
    }
}

РЕДАКТИРОВАТЬ: Я намеренно не углублялся в общую сторону этого ...

6
ответ дан 23 November 2019 в 21:12
поделиться

Что вы имеете в виду под словом «без итерации»?

Вы можете использовать map.entrySet (). Iterator (). Next () , и вы не будете перебирать карту (в значении "прикосновения к каждому объекту"). Вы не можете получить Entry без использования итератора. В документации Javadoc Map.Entry говорится:

Метод Map.entrySet возвращает сборник-просмотр карты, чей элементы этого класса. Единственный способ получить ссылку на карту запись взята из итератора этого коллекция-просмотр. Эти Map.Entry объекты действительны только для продолжительность итерации.

Не могли бы вы объяснить более подробно, чего вы пытаетесь достичь? Если вы хотите сначала обработать объекты, которые соответствуют определенному критерию (например, «иметь конкретный ключ»), а в противном случае вернуться к остальным объектам, то посмотрите на PriorityQueue . Он упорядочит ваши объекты в соответствии с естественным порядком или заданным пользователем Comparator , который вы предоставите.

4
ответ дан 23 November 2019 в 21:12
поделиться

Это позволит получить единственную запись с карты, которая настолько близка, насколько это возможно, учитывая, что «первый» на самом деле не применяется.

import java.util.*;

public class Friday {
    public static void main(String[] args) {
        Map<String, Integer> map = new HashMap<String, Integer>();

        map.put("code", 10);
        map.put("to", 11);
        map.put("joy", 12);

        if (! map.isEmpty()) {
            Map.Entry<String, Integer> entry = map.entrySet().iterator().next();
            System.out.println(entry);
        }
    }
}
3
ответ дан 23 November 2019 в 21:12
поделиться

После вашего РЕДАКТИРОВАНИЯ, вот мое предложение:

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

  • массив (из 2 значений, ключ и значение)
  • простой объект с двумя свойствами
1
ответ дан 23 November 2019 в 21:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: