如何从hashmap中获得一个条目而无需迭代

有没有一个优雅的方式,如果没有知道密钥,只需从HashMap中获取一个Entry<K,V> ,不需要迭代。

由于进入的顺序并不重要,我们可以这样说

 hashMapObject.get(zeroth_index); 

虽然我知道没有这样的索引方法。

如果我尝试了下面提到的方法, 它仍然需要获取散列表的所有条目集

 for(Map.Entry<String, String> entry : MapObj.entrySet()) { return entry; } 

欢迎提出build议。

编辑:请build议任何其他数据结构,以满足要求。

Jesper的回答很好。 另一个解决scheme是使用TreeMap(你问了其他的数据结构)。

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

TreeMap有一个开销,所以HashMap速度更快,但只是一个替代解决scheme的例子。

地图不是有序的,所以没有“第一个入口”这样的事情,这也是为什么Map (或HashMap )没有get-by-index方法。

你可以这样做:

 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()并不意味着你正在迭代整个地图。

我猜迭代器可能是最简单的解决scheme。

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

另一个解决scheme(不漂亮):

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

还是(不是更好):

 return hashMapObject.entrySet().toArray()[0]; 

获取值,将其转换为数组,获取数组的第一个元素:

 map.values().toArray()[0] 

W.

你为什么要避免调用entrySet()它通常不会创build一个全新的对象,而只是提供一个facade对象。 简单地说, entrySet()是一个相当便宜的操作。

如果你真的想要你build议的API,你可以inheritanceHashMap的类,并跟踪列表中的键例如。 没有看到这一点,但它给你你想要的。 如果你解释一下用例,也许我们可以想出一个更好的解决scheme。

 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); } } 

编辑:我故意没有钻研这个generics的一面…

你是什​​么意思与“没有迭代”?

你可以使用map.entrySet().iterator().next() ,你不会遍历map(在“接触每个对象”的意义上)。 你不能在不使用迭代器的情况下获得Entry<K, V> 。 Map.Entry的Javadoc说:

Map.entrySet方法返回地图的集合视图,其元素是这个类的。 获取对映射条目的引用的唯一方法是从此collection-view的迭代器中获取。 这些Map.Entry对象仅在迭代期间有效。

你能否更详细地解释一下,你正在努力完成什么? 如果你想先处理对象,匹配一个特定的标准(比如“有一个特定的键”),否则回退到其余的对象,然后看一个PriorityQueue 。 它会根据自然顺序或您提供的自定义Comparator对您的对象进行sorting。

 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); } } } 

这种方法不起作用,因为你使用了HashMap。 我假设在这种情况下使用LinkedHashMap将是正确的解决scheme。

如果您正在使用Java 8,它就像findFirst()一样简单:

快速示例:

 Optional<Car> theCarFoundOpt = carMap.values().stream().findFirst(); if(theCarFoundOpt.isPresent()) { theCarFoundOpt.get().startEngine(); } 

这将从地图上得到一个单一的条目,因为“第一”并不适用。

 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); } } } 

在这里find了同样的东西……然后我想起了番石榴图书馆的Iterables课程。

获取“第一个”元素: Iterables.getFirst( someMap.values(), null );
基本上和Map.values().iterator().next() ,但是也允许你指定一个默认的(在这种情况下为null),如果Map中没有任何东西的话。

Iterables.getLast( someMap.values(), null ); 返回Map中的最后一个元素。

Iterables.get( someMap.values(), 7, null ); 如果存在则返回Map中的第7个元素,否则返回默认值(在这种情况下为null)。

请记住,虽然HashMaps没有sorting…所以不要指望Iterables.getFirst返回你扔在那里的第一个项目…同样与Iterables.getLast 也许有用得到一个映射值,但。

可能没有必要为此添加Guava库,但是如果您碰巧使用该库中的其他一些很酷的工具…

按照你的编辑,这是我的build议:

如果只有一个条目,则可以用一个双重对象replace该映射。 根据types和您的喜好:

  • 一个数组(2个值,键和值)
  • 具有两个属性的简单对象

我得到了答案:(很简单)

拿一个ArrayList,然后将其转换并查找数组列表的大小。 这里是 :

  ArrayList count = new ArrayList(); count=(ArrayList) maptabcolname.get("k1"); //here "k1" is Key System.out.println("number of elements="+count.size()); 

它会显示大小。 (给build议)。 它正在工作。