对hashmap Java

时间:2016-09-21 04:53:04

标签: java sorting arraylist comparator

给定hashMap并在hashmap中按排序顺序返回arraylist的键 这是函数API:

ArrayList<String> foo(HashMap<String,String> hashMap)
{
}

现在,有两种方法可以解决问题:

  
      
  1. 取出arraylist中的所有键然后对其进行排序
  2.   
  3. 将地图的密钥存储在treeset中,然后存储在arraylist中并返回。
  4.   

以前的方法不会使用额外的空间复杂性,因为我没有使用treeset。键是字母数字。哪一个会减少时间复杂度。 你会推荐其他任何方式吗?

2 个答案:

答案 0 :(得分:2)

在某种程度上取决于你打算在事后对“排序”的东西做什么。

但是在你的情况下,你说:最后,你想要一个排序列表;因此:直接创建一个列表,排序并返回它!

即使两种方法都具有相同的复杂度(O(n * log(n)) - 请记住,对列表进行排序可能更快(因为它只需要在数组中移动元素,而不必创建很多树节点。)

换句话说:创建TreeList然后将其转换为ArrayList意味着肯定会进行大量复制。简单地避免这种情况!

答案 1 :(得分:2)

答案取决于密钥的域名。在某些情况下,以排序的顺序(即在树中)存储密钥是非常有效的。但是我建议在大多数情况下,在检索时排序一次会更有效。

我尝试了以下代码:

    Map<Integer, Integer> map = new HashMap<>();
    Random random = new Random();
    random.ints(1000000).forEach(n -> map.put(n, n));
    long time1 = System.currentTimeMillis();
    Set<Integer> set = new TreeSet<>(map.keySet());
    List<Integer> list1 = new ArrayList<>(set);
    long time2 = System.currentTimeMillis();
    List<Integer> list2 = new ArrayList<>(map.keySet());
    Collections.sort(list2);
    long time3 = System.currentTimeMillis();
    System.out.println("Set approach " + (time2 - time1));
    System.out.println("Sort approach " + (time3 - time2));

结果是3768和1824,我怀疑这两种方法相当典型。

我感兴趣的是,我也试过了:

   List<Integer> list3 = map.keySet().stream().sorted().collect(Collectors.toList());

结果是537毫秒:比Collections.sort方法快3倍多。

然而,当我重新审核了1000万个条目时,这三种方法都进行了

  • 26,916 TreeSet
  • 2,845 for Collection.sort
  • 13,580 Stream.sorted

结论是对数组进行一次排序对于较大的地图来说效率要高得多。