相关疑难解决方法(0)

按值对地图<键,值>进行排序

我是Java的新手,经常发现我需要对Map<Key, Value>值进行排序.

由于值不是唯一的,我发现自己将其转换keySet为a array,并通过数组排序对该数组进行排序,并使用自定义比较器对与键关联的值进行排序.

有没有更简单的方法?

java sorting collections dictionary

1569
推荐指数
27
解决办法
134万
查看次数

如何正确比较Java中的两个整数?

我知道,如果你将盒装原始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)

java autoboxing integer

196
推荐指数
7
解决办法
35万
查看次数

Java 8流映射到按值排序的键列表

我有地图Map<Type, Long> countByType,我希望有一个列表,它按相应的值排序(最小到最大)键.我的尝试是:

countByType.entrySet().stream().sorted().collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

但是这只是给我一个条目列表,如何在不丢失订单的情况下获得类型列表?

java collections lambda java-8 java-stream

57
推荐指数
3
解决办法
10万
查看次数

是否保证Java中的新Integer(i)== i?

请考虑以下代码段:

    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 comparison autoboxing implicit-conversion

25
推荐指数
2
解决办法
3008
查看次数

在Java中按值映射自动排序

我需要在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密耳.

java collections associative-array sorted data-structures

25
推荐指数
1
解决办法
2万
查看次数

如何根据树的值对树图进行排序?

如何使用其值而不是键对树图进行排序?

java treemap

14
推荐指数
4
解决办法
8万
查看次数

设计一个系统,以实时保持前k个频繁的单词

假设我们想要一个系统在最后一小时内保持在推文中出现前k个频繁的单词.怎么设计呢?

我可以提出hashmap,heap,log或MapReduce,但我找不到一种非常有效的方法来做到这一点.

实际上这是一个采访中的问题.
首先,我使用哈希图来计算每个单词的频率.我还保留了一个日志,所以随着时间的推移,我可以倒数最老的单词频率.
然后我保留了一个长度为K(Top K数组)的入口数组和一个数字N,它是数组中最小的计数数.
每次出现一个新单词时,我都会更新计数hashmap并获取这个新单词的计数.如果它大于N,我会发现这个单词是否在数组中.如果是,我更新数组中的条目.如果没有,我删除数组中的最小条目并将新单词插入其中.(相应地更新N)

这是问题,我的方法无法处理删除.我可能需要迭代整个计数hashmap以找到新的顶级K.
而且,正如面试官所说,系统应该非常快速地获得结果.我想几台机器一起工作,每台机器都需要一些文字.但是,如何组合结果也成为一个问题.

algorithm

9
推荐指数
1
解决办法
6241
查看次数

如何根据值List的大小对java中的HashMap进行排序

我有一个像下面这样的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 sorting java-8 java-stream

9
推荐指数
1
解决办法
5666
查看次数

Java的Counter Counter替代品

我一直在使用Python中的Counter()数据结构作为键值存储,允许我使用most_common方法根据其值对对象进行排序.更多信息在这里.

Java语言是否有类似的数据结构?例如,我已经看到许多相关的答案专注于通过数据结构对HashMapsTreeMaps进行排序,最初并未为此目的定义.在我的情况下,我通常需要保留对象的计数器,然后选择最常见的或具有最高分数的那些(前N个查询).但是,我很难,因为我需要插入HashMap然后排序或使用多个数据结构.

python java sorting data-structures

9
推荐指数
2
解决办法
2548
查看次数

如何对HashMap freemarker模板的值进行排序

我在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 freemarker map

7
推荐指数
2
解决办法
7406
查看次数