首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何从Map中获得按值排序然后按键排序的条目列表

如何从Map中获得按值排序然后按键排序的条目列表
EN

Stack Overflow用户
提问于 2022-03-22 06:26:53
回答 4查看 557关注 0票数 1

我的问题是如何根据Map内容的值和键对其进行排序,从而得到条目的List

首先,需要按照降序对条目进行排序,然后如果值发生冲突,还需要按照降序中的对它们进行排序。

给定的示例

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Map<String,Integer> data = new HashMap();
data.put("a",10);
data.put("b",3);
data.put("c",10);

期望顺序:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
["c", 10], ["a",10], ["b",3]
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2022-03-22 06:46:41

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Person implements Comparable<Person>{

    private String name;
    private Integer age;

    public Person(String name, Integer age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public int compareTo(Person person) {
        if(this.age!= person.age){
            return person.age.compareTo(this.age);
        } else {
         return person.name.compareTo(this.name);
        }
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    public static void main(String argsp[]){
        Map<String,Integer> data = new HashMap();
        data.put("a",10);
        data.put("b",3);
        data.put("c",10);

        List<Person> collect = data.entrySet().stream().map(entry -> new Person(entry.getKey(), entry.getValue())).collect(Collectors.toList());
        Collections.sort(collect);
        collect.stream().forEach(person-> System.out.println(person));

    Collection<Map.Entry<String,Integer>> result  = collect.stream().map(person -> 
            new AbstractMap.SimpleEntry<String, Integer>(person.name, person.age)).collect(Collectors.toList());


    }
}

结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Person{name='c', age=10}
Person{name='a', age=10}
Person{name='b', age=3}
票数 -1
EN

Stack Overflow用户

发布于 2022-03-22 08:45:17

为此,需要定义一个Comparator

为此,您可以使用静态方法,这些方法是作为、Java 8的增强添加到ComparatorMap.Entry接口中的。

comparingByValue()Map.Entry接口的comparingByKey()两种方法都将分别为值和键生成比较器。为了得到一个降阶方法,需要对其应用reversed()方法。

两个比较器都与thenComparing()方法链接在一起。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Comparator<Map.Entry<String, Integer>> valDescThenKeyDesc =
       Map.Entry.<String, Integer>comparingByValue().reversed()
           .thenComparing(Map.Entry.<String, Integer>comparingByKey().reversed());

请注意,编译器是,无法根据比较器的结果类型推断comparingByValue()comparingByKey()的正确参数类型,只能基于的。

因此,comparingByValue()comparingByKey()都需要显式地提供泛型类型信息<String, Integer> (键和值的类型)。

如果一开始看起来太难理解,您可能会将它分成几行(在本例中,类型推断工作得很好):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Comparator<Map.Entry<String, Integer>> byValDesc =
       Map.Entry.comparingByValue().reversed();

Comparator<Map.Entry<String, Integer>> byKeyDesc =
       Map.Entry.comparingByKey().reversed();

Comparator<Map.Entry<String, Integer>> valDescThenKeyDesc =
       byValDesc.thenComparing(byKeyDesc);

下一步是创建一个排序的条目列表。

为此,您可以通过将条目集传递给构造函数来手动创建条目的List,然后在其上应用sort()方法,或者使用Stream

为了用流来实现它,首先,我们需要获得一个条目流。通过传递给定的比较器执行sorting()操作,并通过应用终端操作collect()将结果收集到列表中。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public static List<Map.Entry<String, Integer>> getMapEntryList(Map<String,Integer> data,
                                                               Comparator<Map.Entry<String, Integer>> comparator) {
    return data.entrySet().stream()
            .sorted(comparator)
            .collect(Collectors.toList());
}

main()

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public static void main(String[] args) {
    Map<String,Integer> data = Map.of("a",10, "b",3,"c",10);

    Comparator<Map.Entry<String, Integer>> valDescThenKeyDesc =
            Map.Entry.<String, Integer>comparingByValue().reversed()
                    .thenComparing(Map.Entry.<String, Integer>comparingByKey().reversed());

    List<Map.Entry<String, Integer>> result = getMapEntryList(data, valDescThenKeyDesc);
    
    System.out.println(result);
}

输出

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[c=10, a=10, b=3]
票数 3
EN

Stack Overflow用户

发布于 2022-03-22 06:54:29

使用流api和自定义Comparator

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import java.util.HashMap;
import java.util.Map;
import java.util.stream.Collectors;

public class Main {

  static Map<String, Integer> createTestMap() {
    Map<String, Integer> data = new HashMap();
    data.put("a", 10);
    data.put("b", 3);
    data.put("c", 10);
    return data;
  }

  public static void main(String[] args) {
    var sorted = createTestMap().entrySet().stream()
        .sorted(Comparator
            .comparing(Map.Entry<String, Integer>::getValue)
            .thenComparing(Map.Entry<String, Integer>::getKey).reversed())
        .collect(Collectors.toList());
    for (var kv : sorted) {
      System.out.println(
          String.format("%s\t%s", kv.getKey(), kv.getValue()));
    }
  }
  }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71573763

复制
相关文章
Java Map按值排序的正确姿势
1、 Java 8 – Sorting HashMap by values in ascending and descending order
明明如月学长
2021/08/27
3.6K0
C++中map按value排序
那如果我要以value进行排序呢? 方案:将map的key和value以pair的形式装到vector中,对vector进行排序。 (下面使用unordered_map,而没有使用map)
卡尔曼和玻尔兹曼谁曼
2019/01/22
10.9K0
C++中map按value排序
hastable按值排序
最近做了一个项目,需要对一个2维数组的值进行排序然后再取出对应的Key值。开始是用HashTable做的,不过HashTable中的排序只是对Key进行排序,如果想对值进行排序得用其它办法。下面我就把这种方法说下:
codeniu
2022/02/25
1.3K0
map按key和按value排序
看一个题: 查找和排序 题目:输入任意(用户,成绩)序列,可以获得成绩从高到低或从低到高的排列,相同成绩 都按先录入排列在前的规则处理。 例示: jack 70 peter 96 Tom 70 smith 67 从高到低 成绩 peter 96 jack 70 Tom 70 smith 67 从低到高 smith 67 Tom 70 jack 70 peter 96 1、按照value排序 2、可以递增排序和递减排序 3、保证排序的稳定性 golang map按key排序 //golang的map不保证有序
李海彬
2018/03/27
3.2K0
map按key和按value排序
看一个题: 查找和排序 题目:输入任意(用户,成绩)序列,可以获得成绩从高到低或从低到高的排列,相同成绩 都按先录入排列在前的规则处理。 例示: jack 70 peter 96 Tom 70 smith 67 从高到低 成绩 peter 96 jack 70 Tom 70 smith 67 从低到高 smith 67 Tom 70 jack 70 peter 96 1、按照value排序 2、可以递增排序和递减排序 3、保证排序的稳定性 golang map按key排序 //golang的map不保证有序
李海彬
2018/03/27
4.7K0
pandas排序 按索引和值排序
pandas 排序 import pandas as pd import numpy as np unsorted_df=pd.DataFrame(np.random.randn(10,2),index=[1,4,6,2,3,5,9,8,0,7],columns=['col2','col1']) print (unsorted_df) # 按标签排序 sorted_df = unsorted_df.sort_index(ascending=False) # 降序 print (sorted_df) s
AI拉呱
2021/01/14
2.7K0
python中列表排序,字典排序,列表中的字典排序
key= lambda dict1:dict1[0] #dict1[0]表示按键,dict1[1]表示按值。
用户8346838
2021/03/10
9.1K0
如何使用Java8 Stream API对Map按键或值进行排序
在这篇文章中,您将学习如何使用Java对Map进行排序。前几日有位朋友面试遇到了这个问题,看似很简单的问题,但是如果不仔细研究一下也是很容易让人懵圈的面试题。所以我决定写这样一篇文章。在Java中,有多种方法可以对Map进行排序,但是我们将重点介绍Java 8 Stream,这是实现目标的一种非常优雅的方法。
字母哥博客
2020/09/23
7.2K0
如何使用Java8 Stream API对Map按键或值进行排序
将map按照值排序
值里面存放的是一个对象需要根据id排序 将相同的人放在一起 List<Map.Entry<String, CorrectRate>> list = new LinkedList<Map.Entry<String, CorrectRate>>(correctRateOm.entrySet()); Collections.sort(list, new Comparator<Map.Entry<String, CorrectRate>>() {
崔笑颜
2020/06/08
9140
Java中对map按key或val排序
Collections是一个工具类,sort是其中的静态方法,是用来对List类型进行排序的,它有两种参数形式:
sunonzj
2022/06/21
1.6K0
Map按单个或多个Value排序,当Value相同时按Key排序
Map可以先按照value进行排序,然后按照key进行排序。 或者先按照key进行排序,然后按照value进行排序,这都是可以的。
向着百万年薪努力的小赵
2023/01/10
2.5K0
又双叒叕一行代码:Map按值排序
在分段随机实践—模拟线上流量一文中,我将流量模型统计成为一个个Map<F, Integer>形式数据保存起来。
FunTester
2021/07/23
8850
Excel按列排序和按行排序
文章背景:Excel二维表中记录着多行多列的数据,有时需要按行或按列排序,使数据更加清晰、易读。下面分别对按列排序和按行排序进行介绍。
Exploring
2022/08/10
3.1K0
Excel按列排序和按行排序
map排序,根据key给map排序,根据value给map排序
1-------Franch 2-------Canada 3-------China
IT云清
2019/01/22
1.6K0
lua sort排序_python中列表排序的用法
lua中对table的排序一般是用lua自带的table.sort()函数排序,一般不采用自己写的排序的方式,以下来说一说
全栈程序员站长
2022/09/21
1.4K0
Map排序
Map排序的方式有很多种,这里记录下自己总结的两种比较常用的方式:按键排序(sort by key), 按值排序(sort by value)。 按键排序(sort by key) jdk内置的J
xiangzhihong
2018/02/01
7530
Map排序
java中的sort排序算法_vba中sort按某列排序
C++中提供了sort函数,可以让程序员轻松地调用排序算法,JAVA中也有相应的函数。
全栈程序员站长
2022/09/21
2.2K0
python中序列的排序,包括字典排序、列表排序、升序、降序、逆序
我们知道python中的内建序列包括字典、列表、元组、字符串等,序列是python中最基本的数据结构。
刘金玉编程
2019/07/27
8.3K0
将map按照值排序 - 崔笑颜的博客
java对list进行分页 业务场景因为数据是通过从数据库中多次sql查出来之后存放到list 无法使用sql进行分页
崔笑颜
2021/02/22
4220
点击加载更多

相似问题

对Map<Int排序,按值排序,然后按键排序

122

如何先按值排序Map条目,然后按键排序,然后将有序的键放在列表中?

52

C++- map是否先按键排序,然后按值排序?

10

如何按键排序,然后按嵌套值排序

12

按值排序字典,然后按键排序

354
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文