如何从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议)。 它正在工作。