我是Java的新手,经常发现我需要对Map<Key, Value>值进行排序.
由于值不是唯一的,我发现自己将其转换keySet为a array,并通过数组排序对该数组进行排序,并使用自定义比较器对与键关联的值进行排序.
有没有更简单的方法?
我知道,如果你将盒装原始Integer与常量进行比较,例如:
Integer a = 4;
if (a < 5)
Run Code Online (Sandbox Code Playgroud)
a 将自动取消装箱,比较将起作用.
但是,当您比较两个盒装Integers并希望比较相等或小于/大于?时会发生什么?
Integer a = 4;
Integer b = 5;
if (a == b)
Run Code Online (Sandbox Code Playgroud)
以上代码是否会导致检查它们是否是同一个对象,还是会在这种情况下自动取消装箱?
关于什么:
Integer a = 4;
Integer b = 5;
if (a < b)
Run Code Online (Sandbox Code Playgroud)
?
我有地图Map<Type, Long> countByType,我希望有一个列表,它按相应的值排序(最小到最大)键.我的尝试是:
countByType.entrySet().stream().sorted().collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
但是这只是给我一个条目列表,如何在不丢失订单的情况下获得类型列表?
请考虑以下代码段:
int i = 99999999;
byte b = 99;
short s = 9999;
Integer ii = Integer.valueOf(9); // should be within cache
System.out.println(new Integer(i) == i); // "true"
System.out.println(new Integer(b) == b); // "true"
System.out.println(new Integer(s) == s); // "true"
System.out.println(new Integer(ii) == ii); // "false"
Run Code Online (Sandbox Code Playgroud)
很明显为什么最后一行总是打印出来"false":我们正在使用==引用标识比较,而new对象永远不会是==已经存在的对象.
问题是前三行:那些比较保证在原语上int,Integer自动取消装箱?是否存在基元将被自动装箱的情况,并且执行参考标识比较?(那就是全部false!)
我需要在Java中有一个自动按值排序的映射 - 这样当我添加新的键值对或更新现有键值对的值时,它会随时保持排序,甚至删除一些条目.
还请记住,这张地图将会非常庞大(数百万,甚至是数百万条的大小).
所以基本上我正在寻找以下功能:
假设我们有一个实现上述功能的"SortedByValuesMap"类,我们有以下代码:
SortedByValuesMap<String,Long> sorted_map = new SortedByValuesMap<String, Long>();
sorted_map.put("apples", 4);
sorted_map.put("oranges", 2);
sorted_map.put("bananas", 1);
sorted_map.put("lemons", 3);
sorted_map.put("bananas", 6);
for (String key : sorted_map.keySet()) {
System.out.println(key + ":" + sorted_map.get(key));
}
Run Code Online (Sandbox Code Playgroud)
输出应该是:
bananas:6
apples:4
lemons:3
oranges:2
Run Code Online (Sandbox Code Playgroud)
特别是,对我来说真正重要的是能够随时获得具有最低值的条目 - 使用如下命令:
smallestItem = sorted_map.lastEntry();
Run Code Online (Sandbox Code Playgroud)
哪个应该给我'橘子'条目
编辑:我是一个Java新手所以请详细说明你的答案 - 谢谢
EDIT2:这可能会有所帮助:我正在使用它来计算大文本文件中的单词(对于那些熟悉的人:特别是n-gram).所以我需要建立一个地图,其中键是单词,值是这些单词的频率.但是,由于限制(如RAM),我想只保留X最常用的单词 - 但事先你不能知道哪些是最常用的单词.因此,我认为它可能起作用的方式(作为近似)是开始计算单词,当地图达到上限(如1 mil条目)时,将删除最不频繁的条目,以便将地图的大小保持为总是1密耳.
假设我们想要一个系统在最后一小时内保持在推文中出现前k个频繁的单词.怎么设计呢?
我可以提出hashmap,heap,log或MapReduce,但我找不到一种非常有效的方法来做到这一点.
实际上这是一个采访中的问题.
首先,我使用哈希图来计算每个单词的频率.我还保留了一个日志,所以随着时间的推移,我可以倒数最老的单词频率.
然后我保留了一个长度为K(Top K数组)的入口数组和一个数字N,它是数组中最小的计数数.
每次出现一个新单词时,我都会更新计数hashmap并获取这个新单词的计数.如果它大于N,我会发现这个单词是否在数组中.如果是,我更新数组中的条目.如果没有,我删除数组中的最小条目并将新单词插入其中.(相应地更新N)
这是问题,我的方法无法处理删除.我可能需要迭代整个计数hashmap以找到新的顶级K.
而且,正如面试官所说,系统应该非常快速地获得结果.我想几台机器一起工作,每台机器都需要一些文字.但是,如何组合结果也成为一个问题.
我有一个像下面这样的hashmap
Map<String, List<String>> map = new HashMap<>();
map.put("USA", Arrays.asList("CA","IA","IL"));
map.put("India", Arrays.asList("MUM","CAL"));
map.put("Canada", Arrays.asList("TOR"));
Run Code Online (Sandbox Code Playgroud)
我想根据值中升序排列的列表大小对地图进行排序.我该怎么做.有没有很好的方法呢?
我在java中有这个HashMap:
HashMap<String, String> map = new HashMap<String, String>();
map.put("k1", "3");
map.put("k2", "4");
map.put("k3", "2");
map.put("k4", "6");
map.put("k5", "1");
map.put("k6", "5");
Run Code Online (Sandbox Code Playgroud)
我在这种模式下使用freemarker模板打印:
<#list map?values as v>
${v} -
</#list>
Run Code Online (Sandbox Code Playgroud)
但它按此顺序打印:
2 - 6 - 1 - 5 - 3 - 4
Run Code Online (Sandbox Code Playgroud)
我想按此顺序打印:
1 - 2 - 3 - 4 - 5 -6
Run Code Online (Sandbox Code Playgroud)
如何使用freemarker模板对值进行排序?
java ×9
collections ×3
sorting ×3
autoboxing ×2
java-8 ×2
java-stream ×2
algorithm ×1
comparison ×1
dictionary ×1
freemarker ×1
integer ×1
lambda ×1
map ×1
python ×1
sorted ×1
treemap ×1