java键值对_java 键值对 按值排序

在最近写程序题的时候,需要存储一个key为char,value为string的map,后来需要根据string的长度对map从小到大进行排序。

846891f8343ec02541d8e7b61ccab355.png

目标:

bVbiZAI?w=425&h=103

1.用Pair配对

一开始用的是HashMap,但是后面发现HashMap是无序的,于是想把HashMap的一个键值对取出来,存到集合里,再对集合进行自定义排序,上网搜到有一个配对的类Pair,他有一个key和一个value属性,想到用来代替HashMap的一个键值对。

d000f4c1bec3abc140b440980a395027.png

用ArrayList代替HashMap,然后ArrayList中的元素为配对类,变相实现了一个键对应一个值的集合,并且能够排序。

首先存储配对到集合中:

ArrayList> pairs = new ArrayList<>();

Pair pair;

pair = new Pair<>(1, "abc");

pairs.add(pair);

pair = new Pair<>(2, "abcd");

pairs.add(pair);

pair = new Pair<>(3, "ab");

pairs.add(pair);

pair = new Pair<>(4, "abcde");

pairs.add(pair);

对集合进行排序

调用ArrayList对象的sort方法进行排序,他需要Comparator接口,有三种实现方法:

内部类进行排序

public class Main {

public static void main(String[] args) {

ArrayList> pairs = new ArrayList<>();

Pair pair;

pair = new Pair<>(1, "abc");

pairs.add(pair);

pair = new Pair<>(2, "abcd");

pairs.add(pair);

pair = new Pair<>(3, "ab");

pairs.add(pair);

pair = new Pair<>(4, "abcde");

pairs.add(pair);

pairs.sort(new Main().new StringCmp());//建立Main内部类的一个实例对象

}

//实现比较接口的内部类

public class StringCmp implements Comparator{

@Override

public int compare(Object o1, Object o2) {

Pair s1 = (Pair)o1;

Pair s2 = (Pair)o2;

return new Integer(s1.getValue().length()).compareTo(s2.getValue().length());

}

}

}

匿名内部类进行排序

如果不需要复用这个排序的方法,单独为他写一个类太过浪费又不安全,可以使用匿名的内部类

public class Main {

public static void main(String[] args) {

ArrayList> pairs = new ArrayList<>();

Pair pair;

pair = new Pair<>(1, "abc");

pairs.add(pair);

pair = new Pair<>(2, "abcd");

pairs.add(pair);

pair = new Pair<>(3, "ab");

pairs.add(pair);

pair = new Pair<>(4, "abcde");

pairs.add(pair);

//使用匿名内部类

pairs.sort(new Comparator() {

@Override

public int compare(Object o1, Object o2) {

Pair s1 = (Pair)o1;

Pair s2 = (Pair)o2;

return new Integer(s1.getValue().length()).compareTo(s2.getValue().length());

}

});

}

}

判断的代码雷同,只是不用在去新建一个类。

lambda表达式

lambda表达式就是匿名内部类的简写版:

import javafx.util.Pair;

import java.util.ArrayList;

public class Main {

public static void main(String[] args) {

ArrayList> pairs = new ArrayList<>();

Pair pair;

pair = new Pair<>(1, "abc");

pairs.add(pair);

pair = new Pair<>(2, "abcd");

pairs.add(pair);

pair = new Pair<>(3, "ab");

pairs.add(pair);

pair = new Pair<>(4, "abcde");

pairs.add(pair);

pairs.sort((pair1, pair2)->{return new Integer(pair1.getValue().length()).compareTo(new Integer(pair2.getValue().length()));});

}

}

2.用TreeMap进行排序

用配对进行存储初步解决了目的,但是这样存储的就不是Map而是ArrayList的了,也就不能使用Map的方法,虽然解决了需求,但是感觉方向错了,去网上一搜,返现Map有能够排序的实现类TreeMap,他仅需创建时传入Comparator的接口实现类,就能够实现存储是排序了:

public class Main {

public static void main(String[] args) {

TreeMap treeMap = new TreeMap((s1, s2)->{

return new Integer(s1.length()).compareTo(new Integer(s2.length()));

});

treeMap.put("abc", 1);

treeMap.put("abcd", 2);

treeMap.put("ab", 3);

treeMap.put("abcde", 4);

}

}

代码简短,通俗易懂,但是因为TreeMap只能按照key进行排序,而我的要求是根据value的长度进行排序,所有在这里我把key和value的类型互换了,但这样之前可以通过int类型的编号找到string类型值,在更改之后,就不能通过标号找到值了.虽然有好处良多,但是不符合我的情况.

3.HashMap转成list再排序

HashMap的对象有一个方法,他可以把所有的键值对集合转换为一个set集合,集合元素是Map.Entry,可以把HashMap转换为Set之后再转换成ArrayList再调用sort方法进行排序,达到根据value进行排序的效果:

public class Main {

public static void main(String[] args) {

HashMap hashMap = new HashMap<>();

hashMap.put(1, "aec");

hashMap.put(2, "abcd");

hashMap.put(3, "ab");

hashMap.put(4, "abcde");

ArrayList> arrayList = new ArrayList<>(hashMap.entrySet());

arrayList.sort((entry1, entry2)->{

return new Integer(entry1.getValue().length()).compareTo(new Integer(entry2.getValue().length()));

});

}

}

感觉这是第一种方法,加上一个HashMap得到的结果,这样可以从按照value进行排序(排序结果保存在arrayList中),也可以从key找到value(在HashMap中),但是存储内存却浪费了,多了一个list,不知道有没有直接根据value直接排序的map.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值