首页 > 编程知识 正文

python字典根据键值排序,java键值对的数据结构

时间:2023-05-05 20:53:43 阅读:41970 作者:1644

最近写程序问题时,必须保存key为char、value为string的贴图。 然后,必须根据字符串的长度按从小到大的顺序对贴图进行排序。

目标:

用Pair配对

一开始我使用的是HashMap,后来我发现HashMap是无序的,我想取出一对HashMap键值保存在集合中,然后自定义集合并对其进行排序。 在网上搜索中找到了有一对的类Pair。 他有一个key和value属性,他想使用一对键值来代替HashMap。

通过使用ArrayList而不是HashMap,并将ArrayList中的元素组成一个对类,一个键现在可以对应于一组值并对其进行排序。

首先保存与收藏配对的:

ArrayList pairs=new ArrayList (;

Pair pair;

pair=newpair(1,' abc ' );

Pairs.add(Pair );

pair=newpair(2,' abcd ';

Pairs.add(Pair );

pair=newpair(3,' ab ' );

Pairs.add(Pair );

pair=newpair(4,' abcde ' );

Pairs.add(Pair );

对集合进行排序

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

内部类排序

公共类主{

publicstaticvoidmain (字符串[ ] args ) {

ArrayList pairs=new ArrayList (;

Pair pair;

pair=newpair(1,' abc ' );

Pairs.add(Pair );

pair=newpair(2,' abcd ' );

Pairs.add(Pair );

pair=newpair(3,' ab ' );

Pairs.add(Pair );

pair=newpair(4,' abcde ' );

Pairs.add(Pair );

pairs.sort(newmain ).new StringCmp ) ); 创建Main内部类的实例对象

}

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

publicclassstringcmpimplementscomparator {

@Override

公共int比较(Object o2,Object o2 ) {

pairS1=(pair ) o1;

Pair s2=(Pair ) o2;

返回新整数(S1.getvalue (.length ) ).com Pareto (S2.getvalue ) ).length );

}

}

}

按匿名内部类排序

如果不需要重用此排序方法,则可以使用匿名的内部类,因为单独编写类是徒劳的和不安全的

公共类主{

publicstaticvoidmain (字符串[ ] args ) {

ArrayList pairs=new ArrayList (;

Pair pair;

pair=newpair(1,' abc ' );

Pairs.add(Pair );

pair=newpair(2,' abcd ';

Pairs.add(Pair );

pair=newpair(3,' ab ' );

Pairs.add(Pair );

pair=newpair(4,' abcde ' );

Pairs.add(Pair );

//使用匿名内部类

pairs.sort (新比较器) ) )。

@Override

公共int比较(Object o2,Object o2 ) {

pairS1=(pair ) o1;

Pair s2=(Pair ) o2;

返回新整数(S1.getvalue (.length ) ).com Pareto (S2.getvalue ) ).length );

}

);

}

}

判断的代码是一样的,只是不需要组成新的类。

lambda公式

lambda表达式是匿名内部类的缩写:

import javafx.util.Pair;

import java.util.ArrayList;

公共类主{

publicstaticvoidmain (字符串[ ] args ) {

ArrayList pairs=new ArrayList (;

Pair pair;

pair=newpair(1,' abc ' );

Pairs.add(Pair );

pair=newpair(2,' abcd ';

Pairs.add(Pair );

pair=newpair(3,' ab ' );

Pairs.add(Pair );

pair=newpair(4,' abcde ' );

Pairs.add(Pair );

pairs.sort () pair2,pair2) -返回新integer ) pair1.getvalue ).length ).com Pareto (new integer ) pair2.length );

}

}

按TreeMap排序

虽然通过成对保存暂时解决了目的,但这样保存的不是Map而是ArrayList的,不能使用Map的方法。 需求解决了,但感觉方向错了。 在网上搜索后发现,Map有一个可排序的实现类TreeMap,他只需在创建时将其传递给Comparator的接口实现类,即可实现存储是可排序的:

公共类主{

publicstaticvoidmain (字符串[ ] args ) {

三重映射树=新三重映射((S1,s2 )-{

返回新integer (S1.length ().com Pareto (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对象提供了一种将所有键值对集合转换为一个集集合的方法。 集合元素为Map.Entry,通过将HashMap转换为set,再转换为ArrayList,然后调用sort方法进行排序,可以达到根据value进行排序的效果:

公共类主{

publicstaticvoidmain (字符串[ ] 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 ((条目1,条目2 )-{

返回新integer (entry1. getvalue (.length ) ).com Pareto (new integer ) entry2. getvalue (.length ) );

);

}

}

这是第一种方法,我觉得是把HashMap得到的结果加起来的。 这样既可以按value排序,也可以从key中找到value,但浪费了存储内存,增加了一个列表。 不知道是否存在通过value直接排序的映射。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。