Java LinkedHashMap获取第一个或最后一个条目。

184

我使用了LinkedHashMap,因为在该映射表中,键的输入顺序很重要。

但现在,我想得到第一个(最先输入的)或最后一个键的值。

是否需要像first()last()这样的方法?

我是否需要一个迭代器来获取第一个键入口?这就是我使用LinkedHashMap的原因!

谢谢!


6
情况确实很不幸。这是一个(低优先级的)功能请求,将提供您所需的内容:http://bugs.sun.com/view_bug.do?bug_id=6266354 - Kevin Bourrillion
1
这个链接 https://dev59.com/hG865IYBdhLWcg3wIa7M#30984049 可能会对你有所帮助。 - Ayaz Alifov
我不明白为什么 LinkedHashMap 没有实现 Deque。它完全可以这样做。 - forresthopkinsa
3
为了跟进@KevinBourrillion 13年前的评论,这个功能终于在Java 21中被添加了,通过序列化集合特性(JDK-8280836)。我已经将此作为答案添加了(https://dev59.com/cHI-5IYBdhLWcg3wR2Jr#76461679)。 - M. Justin
17个回答

2

对于第一个元素,使用entrySet().iterator().next(),并在迭代一次后停止迭代。 对于最后一个元素,最简单的方法是在每次map.put时将键保存在变量中。


1
LinkedHashMap虽然没有提供获取第一个、最后一个或任何特定对象的方法,但是获取它们还是相当简单的。
Map<Integer,String> orderMap = new LinkedHashMap<Integer,String>();  
Set<Integer> al =   orderMap.keySet();

现在在 al 对象上使用迭代器,您可以获取任何对象。


1
        import java.util.Arrays;
        import java.util.LinkedHashMap;
        import java.util.List;
        import java.util.Map;

        public class Scratch {
           public static void main(String[] args) {

              // Plain java version

              Map<String, List<Integer>> linked = new LinkedHashMap<>();
              linked.put("a", Arrays.asList(1, 2, 3));
              linked.put("aa", Arrays.asList(1, 2, 3, 4));
              linked.put("b", Arrays.asList(1, 2, 3, 4, 5));
              linked.put("bb", Arrays.asList(1, 2, 3, 4, 5, 6));

              System.out.println("linked = " + linked);

              String firstKey = getFirstKey(linked);
              System.out.println("firstKey = " + firstKey);
              List<Integer> firstEntry = linked.get(firstKey);
              System.out.println("firstEntry = " + firstEntry);

              String lastKey = getLastKey(linked);
              System.out.println("lastKey = " + lastKey);
              List<Integer> lastEntry = linked.get(lastKey);
              System.out.println("lastEntry = " + lastEntry);



           }

           private static String getLastKey(Map<String, List<Integer>> linked) {
              int index = 0;
              for (String key : linked.keySet()) {
             index++;
             if (index == linked.size()) {
                return key;
             }
              }
              return null;
           }

           private static String getFirstKey(Map<String, List<Integer>> linked) {
              for (String key : linked.keySet()) {
             return key;
              }
              return null;
           }
        }

你可以在你的回答中加入解释,以说明你需要做什么不同/添加或删除了什么。 - zerbene

0

是的,我遇到了同样的问题,但幸运的是我只需要第一个元素……这是我为此所做的。

private String getDefaultPlayerType()
{
    String defaultPlayerType = "";
    for(LinkedHashMap.Entry<String,Integer> entry : getLeagueByName(currentLeague).getStatisticsOrder().entrySet())
    {
        defaultPlayerType = entry.getKey();
        break;
    }
    return defaultPlayerType;
}

如果您需要最后一个元素,我建议您研究如何反转您的映射顺序 - 将其存储在临时变量中,访问反转映射中的第一个元素(因此它将是您的最后一个元素),然后删除临时变量。
以下是一些关于如何反转哈希表顺序的好答案: 如何在Java中迭代哈希表的反向顺序 如果您使用了上面链接中的帮助,请给他们点赞 :) 希望这能帮助到某个人。

0

没错,你必须手动枚举键集直到链表的末尾,然后通过键检索条目并返回该条目。


0

1
ConcurrentSkipListMap需要一个比较器(或自然比较器),因此您需要额外的工作来保存放置条目的顺序。 - AlikElzin-kilaka
HashMap和特别是LinkedHashMap提供平均O(1)的访问 - 相反,SkipList提供平均O(logn)的访问。 - AlikElzin-kilaka
1
地图根据其键的自然顺序进行排序。 - user1743310

0
public static List<Fragment> pullToBackStack() {
    List<Fragment> fragments = new ArrayList<>();
    List<Map.Entry<String, Fragment>> entryList = new ArrayList<>(backMap.entrySet());
    int size = entryList.size();
    if (size > 0) {
        for (int i = size - 1; i >= 0; i--) {// last Fragments
            fragments.add(entryList.get(i).getValue());
            backMap.remove(entryList.get(i).getKey());
        }
        return fragments;
    }
    return null;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接