Java 排序hashmap who';s键是另一个hashmap
这是我的hashmapJava 排序hashmap who';s键是另一个hashmap,java,sorting,dictionary,arraylist,hashmap,Java,Sorting,Dictionary,Arraylist,Hashmap,这是我的hashmap public HashMap<Integer, HashMap<String, Integer>> girls = new HashMap<Integer, HashMap<String, **Integer**>>();; public HashMap女孩= 新的HashMap();; 我想按值对粗体排序。为了澄清这一点,外部的hashMaps键代表一个女孩出生的年份,而内部的hashma
public HashMap<Integer, HashMap<String, Integer>> girls =
new HashMap<Integer, HashMap<String, **Integer**>>();;
public HashMap女孩=
新的HashMap();;
我想按值对粗体排序。为了澄清这一点,外部的hashMaps键代表一个女孩出生的年份,而内部的hashmap则代表一个与这个名字的流行度排名对应的名字
比如说,2015年,47373名婴儿使用了阿比盖尔这个名字,这是那一年最流行的名字,我想返回公元前1号,这是第一号名字。有没有办法用这种方式对hashmap进行排序
如何将内部hashmaps值转换为一个arraylist,以便轻松排序?有什么帮助吗 按照地图数据结构中的值对地图进行排序没有简单/优雅的方法
s未按定义排序HashMap
s按插入顺序排序LinkedHashMap
s按键排序TreeMap
LinkedHashMap
作为“内部”结构构建数据结构,并确保首先插入最大值
或者,您可以编写一个小类
class NameFrequency
{
String name;
int frequency;
}
并将您的数据结构设置为HashMap
,并为TreeSet
定义一个比较器,它按照您喜欢的方式对这些对象进行排序
或者,最后,您可以保持数据结构不变,仅在访问时对其进行排序:
girls.get(2015).entrySet().stream()
.sorted((entry1, entry2) -> entry2.getValue() - entry1.getValue())
.forEachOrdered(entry -> System.out.println(entry.getKey() + ": " + entry.getValue()));
最好只为名称和出现次数创建一个类
import java.util.Objects;
public class NameCount implements Comparable<NameCount> {
private final String name;
private int count;
public NameCount(String name) {
this.name = name;
count = 0;
}
public NameCount(String name, int count) {
this.name = name;
this.count = count;
}
public int getCount() {
return count;
}
public void setCount(int count) {
this.count = count;
}
public void incrementCount() {
count++;
}
@Override
public int hashCode() {
return Objects.hashCode(this.name);
}
@Override
public boolean equals(Object obj) {
if(obj == null) return false;
if(getClass() != obj.getClass()) return false;
final NameCount other = (NameCount)obj;
if(!Objects.equals(this.name, other.name)) return false;
return true;
}
@Override
public int compareTo(NameCount o) {
return o.count - count;
}
}
使用
TreeSet
map值来保证唯一的名称条目并一直保持它们的排序似乎更有意义,但请注意,这样做不会让您获得索引。排序一个hashmap的可能重复项谁的键是另一个hashmap我在您的问题中没有看到类似的情况。很抱歉,但是在理解键和值之间的差异时,似乎仍然存在一些问题。我建议您至少阅读javadoc,而HashMap
作为TreeMap
通常会更好。您想要每年的顶级名称吗?“名称频率”。。。这听起来确实比我的“姓名计数”好。不过要小心TreeSet。就在今天,我遇到了一个令我惊讶的问题,因为它与Set有不同的平等标准。请查看我答案中的链接,了解这可能最终出错的原因。在Java8中,使用lambdas确实是更优雅的解决方案。
public void test(Map<Integer, List<NameCount>> map) {
int year = 2017;
List<NameCount> list = map.get(year);
// Do null-check on list first when using this...
Collections.sort(list);
NameCount check = new NameCount("Abigail");
int rank = list.indexOf(check) + 1;
}