Создать пользовательское исключение для тестирования? Тогда Вы могли добавить любые пользовательские свойства, на которых Вы хотите, чтобы исключение несло с ним, он - путь посредством обработки исключений / регистрирующий процесс...
[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);
}
Ответ Джеспера хороший. Другое решение - использовать TreeMap (вы запросили другие структуры данных).
TreeMap<String, String> myMap = new TreeMap<String, String>();
String first = myMap.firstEntry().getValue();
String firstOther = myMap.get(myMap.firstKey());
TreeMap имеет накладные расходы, поэтому HashMap работает быстрее, но это просто как пример альтернативного решения.
Карты не упорядочены, поэтому не существует такого понятия, как «первая запись», и именно поэтому нет метода получения по индексу на 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 ()
не означает, что вы повторяются по всей карте.
Думаю, итератор может быть самым простым решением.
return hashMapObject.entrySet().iterator().next();
Другое решение (не очень красивое):
return new ArrayList(hashMapObject.entrySet()).get(0);
Или еще (не лучше):
return hashMapObject.entrySet().toArray()[0];
Почему вы не хотите вызывать entrySet ()
, он не обычно создает совершенно новый объект со своим собственным контекстом, а вместо этого просто предоставляет фасадный объект. Проще говоря, entrySet ()
- довольно дешевая операция.
Если вам действительно нужен предложенный вами 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);
}
}
РЕДАКТИРОВАТЬ: Я намеренно не углублялся в общую сторону этого ...
Что вы имеете в виду под словом «без итерации»?
Вы можете использовать map.entrySet (). Iterator (). Next ()
, и вы не будете перебирать карту (в значении "прикосновения к каждому объекту"). Вы не можете получить Entry
без использования итератора. В документации Javadoc Map.Entry говорится:
Метод Map.entrySet возвращает сборник-просмотр карты, чей элементы этого класса. Единственный способ получить ссылку на карту запись взята из итератора этого коллекция-просмотр. Эти Map.Entry объекты действительны только для продолжительность итерации.
Не могли бы вы объяснить более подробно, чего вы пытаетесь достичь? Если вы хотите сначала обработать объекты, которые соответствуют определенному критерию (например, «иметь конкретный ключ»), а в противном случае вернуться к остальным объектам, то посмотрите на PriorityQueue . Он упорядочит ваши объекты в соответствии с естественным порядком или заданным пользователем Comparator
, который вы предоставите.
Это позволит получить единственную запись с карты, которая настолько близка, насколько это возможно, учитывая, что «первый» на самом деле не применяется.
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);
}
}
}
После вашего РЕДАКТИРОВАНИЯ, вот мое предложение:
Если у вас есть только одна запись, вы можете заменить карту двойным объектом. В зависимости от типов и ваших предпочтений: