给定hashMap
并在hashmap
中按排序顺序返回arraylist
的键
这是函数API:
ArrayList<String> foo(HashMap<String,String> hashMap)
{
}
现在,有两种方法可以解决问题:
- 取出arraylist中的所有键然后对其进行排序
- 将地图的密钥存储在treeset中,然后存储在arraylist中并返回。
醇>
以前的方法不会使用额外的空间复杂性,因为我没有使用treeset。键是字母数字。哪一个会减少时间复杂度。 你会推荐其他任何方式吗?
答案 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万个条目时,这三种方法都进行了
TreeSet
Collection.sort
Stream.sorted
结论是对数组进行一次排序对于较大的地图来说效率要高得多。