Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 排序hashmap who';s键是另一个hashmap_Java_Sorting_Dictionary_Arraylist_Hashmap - Fatal编程技术网

Java 排序hashmap who';s键是另一个hashmap

Java 排序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

这是我的hashmap

   public HashMap<Integer, HashMap<String, Integer>> girls =  
          new HashMap<Integer, HashMap<String, **Integer**>>();;
public HashMap女孩=
新的HashMap();;
我想按值对粗体排序。为了澄清这一点,外部的hashMaps键代表一个女孩出生的年份,而内部的hashmap则代表一个与这个名字的流行度排名对应的名字

比如说,2015年,47373名婴儿使用了阿比盖尔这个名字,这是那一年最流行的名字,我想返回公元前1号,这是第一号名字。有没有办法用这种方式对hashmap进行排序


如何将内部hashmaps值转换为一个arraylist,以便轻松排序?有什么帮助吗

按照地图数据结构中的值对地图进行排序没有简单/优雅的方法

  • HashMap
    s未按定义排序
  • LinkedHashMap
    s按插入顺序排序
  • TreeMap
    s按键排序
如果确实需要,可以编写一个算法,使用
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;

}