从HashMap获取第一个和最后一个元素

时间:2014-09-09 10:11:30

标签: java hashmap

我有以下代码,我希望能够从Map中获取第一个和最后一个元素,并将每个元素分配给一个字符串。

String result1stElement = null;
String resultLastElement = null;

Map<String, String> result = new HashMap<String, String>();
result = myModel.getSampleResults();

任何想法。

提前致谢。

6 个答案:

答案 0 :(得分:3)

首先,地图不是有序的,所以你不会真正拥有第一个和最后一个元素。

但是,如果你想获得它的第一个和最后一个元素,你可以只获取值并将其转换为数组。这不是很漂亮,但它会起作用。

Map<String, String> result = new HashMap<String, String>();
result = myModel.getSampleResults();
map.values().toArray()[0]; //First result
map.values().toArray()[result.size()-1]; //Last result

注意:这不是使用编译器测试的。

答案 1 :(得分:2)

第一个和最后一个元素概念不适用于基于哈希的结构,如HashMap和HashSet。 插入或删除密钥可能会导致元素在运行中重新排序。

我猜你的模型结果是一个键值对列表,而不是哈希映射。在这种情况下,元素排序就位。 LinkedHashMap保持元素的插入顺序。

HashMap替换为LinkedHashMap(并修改.getSampleResults())以返回LinkedHashMap并查看此问题以获取更多详细信息Java LinkedHashMap get first or last entry

答案 2 :(得分:0)

HashMap中没有第一个和最后一个元素。这是您必须为O(1)查找支付的价格:在内部,实现会将您的条目放入一个桶列表中,而不是易于识别(但确定性)的顺序。此过程将Hash放入HashMap,实际上它越混乱,性能就越好。

如果您希望按照其键的自然顺序(或自定义比较器)排序地图,则可以使用TreeMap;如果您希望将元素排列在其中,则可以使用LinkedHashMap插入的顺序。

P.s。:即使您选择保持某种顺序的Map实现,调用toArray()只是为了得到第一个和最后一个元素是一个巨大的矫枉过正,我不会这样做。 TreeMap具有firstEntry()lastEntry()方法,即使使用LinkedHashMap,只需手动迭代元素并保留第一个和最后一个而不是分配一个元素,便宜得多潜在的巨大阵容。

答案 3 :(得分:0)

HashMap没有订单这样的东西。来自HashMap javadoc

  

此课程不保证地图的顺序;在   特别是,它不保证订单将保持不变   随着时间的推移。

您必须使用LinkedHashMap。看看entrySet()方法和这个question+answer

答案 4 :(得分:0)

可以使用

&#34; toArray&#34; Set接口的方法。

但迭代条目集中的条目并获取第一个和最后一个条目是一种更好的方法。

此示例可能会有所帮助:

public static void main(final String[] args) {
        final Map<Integer,String> orderMap = new LinkedHashMap<Integer,String>();
        orderMap.put(6, "Six");
        orderMap.put(7, "Seven");
        orderMap.put(3, "Three");
        orderMap.put(100, "Hundered");
        orderMap.put(10, "Ten");

        final Set<Entry<Integer, String>> mapValues = orderMap.entrySet();
        final int maplength = mapValues.size();
        final Entry<Integer,String>[] test = new Entry[maplength];
        mapValues.toArray(test);

        System.out.print("First Key:"+test[0].getKey());
        System.out.println(" First Value:"+test[0].getValue());

        System.out.print("Last Key:"+test[maplength-1].getKey());
        System.out.println(" Last Value:"+test[maplength-1].getValue());
    }

// the output geneated is :
First Key:6 First Value:Six
Last Key:10 Last Value:Ten

答案 5 :(得分:0)

您对@ Nikolay的回答的评论显示了您的问题的重要细节,直到现在才隐藏。

那么,你想测试一个使用HashMap结构的方法来引用一些添加的对象而你想测试,如果这个方法在这个结构中提供了一些排序?第一个添加的对象应保持在“第一个位置”,最后添加的对象位于“最后位置”?

正如其他答案已经表明的那样,没有重构那种方法是没有办法的。 HashMap根本不提供任何有意义的排序,如果该方法应该提供一些排序,那么它就会被破坏 - 实现是错误的。

当然,您可以使用@Sander提供的算法编写单元测试。此测试大多数时间都会失败。这再一次表明了这样一个事实,即测试方法必须像@Nikolay在他的回答中所显示的那样重构。

相关问题