最近写程序问题时,必须保存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直接排序的映射。