Java LinkedHashMap獲取第一個或最後一個條目

Java LinkedHashMap獲取第一個或最後一個條目
問題
我使用了LinkedHashMap,因爲重要的是鍵在 Map 中輸入的順序。

但是現在我想首先獲得key的值(第一個輸入的條目)或者最後一個。

應該有類似first()和last()之類的方法嗎?

我是否需要一個迭代器來獲取第一個鍵入口?這就是爲什麼我用了LinkedHashMap!

謝謝!

#1 熱門回答(120 贊)
LinkedHashMap的語義仍然是Map的語義,而不是aLinkedList的語義。它保留了插入順序,是的,但這是一個實現細節,而不是其界面的一個方面。

獲得"第一"條目的最快方式仍然是entrySet().iterator().next()。獲取"最後"條目是可能的,但是需要通過調用.next()迭代整個條目集,直到達到最後一個.while (iterator.hasNext()) { lastElement = iterator.next() }

編輯:但是,如果你願意超越JavaSE API,Apache Commons Collections有自己的LinkedMap實現,它有像firstKey和lastKey這樣的方法,可以滿足你的需求。界面相當豐富。

#2 熱門回答(12 贊)
你可以嘗試做類似的事情(獲得最後一個條目):

linkedHashMap.entrySet().toArray()[linkedHashMap.size() -1];
這是O(N)😃

#3 熱門回答(8 贊)
LinkedHashMap當前實現(Java 8)跟蹤其尾部。如果考慮性能和/或 Map 大小,你可以通過反射訪問該字段。

由於實施可能會發生變化,因此也可能採用後備策略。如果拋出異常,你可能希望記錄某些內容,因此你知道實現已更改。

它可能看起來像:

public static <K, V> Entry<K, V> getFirst(Map<K, V> map) {
if (map.isEmpty()) return null;
return map.entrySet().iterator().next();
}

public static <K, V> Entry<K, V> getLast(Map<K, V> map) {
try {
if (map instanceof LinkedHashMap) return getLastViaReflection(map);
} catch (Exception ignore) { }
return getLastByIterating(map);
}

private static <K, V> Entry<K, V> getLastByIterating(Map<K, V> map) {
Entry<K, V> last = null;
for (Entry<K, V> e : map.entrySet()) last = e;
return last;
}

private static <K, V> Entry<K, V> getLastViaReflection(Map<K, V> map) throws NoSuchFieldException, IllegalAccessException {
Field tail = map.getClass().getDeclaredField(“tail”);
tail.setAccessible(true);
return (Entry<K, V>) tail.get(map);
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章