导航:首页 > 编程语言 > javatreemap排序

javatreemap排序

发布时间:2022-05-31 11:07:26

Ⅰ TreeMap的排序问题

public interface Comparator<T>比较函数强行对某些对象 collection 进行整体排序。可以将 Comparator 传递给 sort 方法(如 Collections.sort),从而允许在排序顺序上实现精确控制。还可以使用 Comparator 来控制某些数据结构(如 TreeSet 或 TreeMap)的顺序。

当且仅当对于一组元素 S 中的每个 e1 和 e2 而言,(compare((Object)e1, (Object)e2)==0) 与 e1.equals((Object)e2) 具有相等的布尔值时,Comparator c 强行对 S 进行的排序才叫做与等号一致 的排序。

当使用具有与等号一致的强行排序能力的 comparator 对有序 set(或有序映射)进行排序时,应该小心谨慎。假定一个带有显式 Comparator c 的有序 set(或有序映射)与从 set S 中抽取出来的元素(或键)一起使用。如果 c 强行对 S 进行的排序与等号一致,那么有序 set(或有序映射)将是行为“怪异的”。尤其是那些将违背根据 equals 所定义 set(或映射)的常规协定的有序 set(或有序映射)。

例如,如果使用 comparator c 将满足 (a.equals((Object)b) && c.compare((Object)a, (Object)b) != 0) 的两个键 a 和 b 添加到有序 set 中,则第二个 add 操作将返回 false(有序 set 的大小没有增加),因为从有序 set 的角度来看,a 和 b 是相等的。

注:通常用 comparator 来实现 java.io.Serializable 是一个好主意,因为它们在可序列化的数据结构(像 TreeSet、TreeMap)中可用作排序方法。为了成功地序列化数据结构,comparator(如果已提供)必须实现 Serializable。

在算术上,定义给定 comparator c 对给定对象 set S 强行实施整体排序 的关系式 为:

{(x, y) such that c.compare((Object)x, (Object)y) <= 0}.
整体排序的商 是:
{(x, y) such that c.compare((Object)x, (Object)y) == 0}.
它直接遵循 compare 的协定,商是 S 上的等价关系,自然顺序是 S 上的整体排序。当我们说 c 强行对 S 的排序是与等号一致 时,意思是说自然排序的商是对象的 equals(Object) 方法所定义的等价关系:
{(x, y) such that x.equals((Object)y)}.

Ⅱ java map容器 哪些排序

一.理论准备
Map是键值对的集合接口,它的实现类主要包括:HashMap,TreeMap,Hashtable以及LinkedHashMap等。
TreeMap:基于红黑树(Red-Black tree)的 NavigableMap 实现,该映射根据其键的自然顺序进行排序,或者根据创建映射时提供的 Comparator 进行排序,具体取决于使用的构造方法。
HashMap的值是没有顺序的,它是按照key的HashCode来实现的,对于这个无序的HashMap我们要怎么来实现排序呢?参照TreeMap的value排序。
Map.Entry返回Collections视图。

二.key排序
TreeMap默认是升序的,如果我们需要改变排序方式,则需要使用比较器:Comparator。Comparator可以对集合对象或者数组进行排序的比较器接口,实现该接口的public compare(T o1,To2)方法即可实现排序,如下:
import java.util.Comparator;import java.util.Iterator;import java.util.Map;import java.util.Set;import java.util.TreeMap;public class TreeMapTest { public static void main(String[] args) { Map<String, String> map = new TreeMap<String, String>( new Comparator<String>() { public int compare(String obj1, String obj2) { // 降序排序 return obj2.compareTo(obj1); } }); map.put("b", "ccccc"); map.put("d", "aaaaa"); map.put("c", "bbbbb"); map.put("a", "ddddd"); Set<String> keySet = map.keySet(); Iterator<String> iter = keySet.iterator(); while (iter.hasNext()) { String key = iter.next(); System.out.println(key + ":" + map.get(key)); } }}

运行结果如下:
d:aaaaac:bbbbbb:ccccca:ddddd

三.value排序
上面例子是对根据TreeMap的key值来进行排序的,但是有时我们需要根据TreeMap的value来进行排序。对value排序我们就需要借助于Collections的sort(List<T> list, Comparator<? super T> c)方法,该方法根据指定比较器产生的顺序对指定列表进行排序。但是有一个前提条件,那就是所有的元素都必须能够根据所提供的比较器来进行比较,如下:
import java.util.ArrayList;import java.util.Collections;import java.util.Comparator;import java.util.List;import java.util.Map;import java.util.Map.Entry;import java.util.TreeMap;public class TreeMapTest { public static void main(String[] args) { Map<String, String> map = new TreeMap<String, String>(); map.put("a", "ddddd"); map.put("c", "bbbbb"); map.put("d", "aaaaa"); map.put("b", "ccccc"); //这里将map.entrySet()转换成list List<Map.Entry<String,String>> list = new ArrayList<Map.Entry<String,String>>(map.entrySet()); //然后通过比较器来实现排序 Collections.sort(list,new Comparator<Map.Entry<String,String>>() { //升序排序 public int compare(Entry<String, String> o1, Entry<String, String> o2) { return o1.getValue().compareTo(o2.getValue()); } }); for(Map.Entry<String,String> mapping:list){
System.out.println(mapping.getKey()+":"+mapping.getValue());
}
}}

运行结果如下:
d:aaaaac:bbbbbb:ccccca:ddddd

Ⅲ 用java实现TreeMap的排序问题。。。。急急急。。。。

TreeMap(Comparator<? super K> comparator)
构造一个新的、空的树映射,该映射根据给定比较器进行排序。
注意这个构造方法....这个构造方法是传进去一个比较器,当然比较器可以自己写 他会按照比较器排序.....!!
keySet()
返回此映射包含的键的 Set 视图。
这个方法 返回set 然后调用set的方法得到键的值 就是排完序的键的值了....

Ⅳ Java中的map会自动排序吗是按什么排序的

java中的map默认是对元素不排序的,但是map的实现类treemap能够把它保存的记录根据key排序,默认是按升序排序。如果我们想要改变排序方式,则需要使用比较器:comparator。

Ⅳ java treeMap 排序后 get不到value

你想按照map的value进行排序,首先你的compare接口就是个错误的实现,一般会实现2个if分支,就是比较的值要求是返回3种情况-1,0,1。为啥要这样?如果你不这样做会产生很多bug,你去看看treemap的源码,在使用你自己实现的comparator借口进行比较的时候有

while(p!=null){
intcmp=cpr.compare(k,p.key);
if(cmp<0)
p=p.left;
elseif(cmp>0)
p=p.right;
else
returnp;
}

但是你自己实现的接口没有else那种情况,就是cmp=0那种情况,所以永远得不到key对应的value了。


你的问题有两种方法解决在你的comapre方法改为

publicintcompare(Stringa,Stringb){
if(base.get(a)>base.get(b)){
return-1;
}elseif(base.get(a)<base.get(b)){
return1;
}else{
return0;
}
}

或者你取value的时候不通过get方法,而是通过

Set<Entry<String,Double>>set=sorted_map.entrySet();
for(Entry<String,Double>i:set){
System.out.println(i.getValue());
}

Ⅵ java中TreeMap中,对Student(name,age); 如何对name进行排序

Map map = new TreeMap(new Comparator<Student>(){
@Override
public int compare(Student stu1, Student stu2) {
//TODO:重写compare方法.
}
});

Map, 和TreeMap可以使用泛型.

Ⅶ java TreeMap 中的key是怎么排序的呢 如果说key是 Double 类型的,自动排序的结果是从小到大的么

可以的,你可以看下TreeMap API帮助文档的介绍
例子如下
@Test
public void test() {
TreeMap<Double,String> treeMap = new TreeMap();
treeMap.put(0.1003, "zhangsan");
treeMap.put(1.1, "lisi");
treeMap.put(1.00031, "wangwu");
treeMap.put(0.1102, "xiaohong");

Set<Entry<Double, String>> entry = treeMap.entrySet();
for(Iterator<Entry<Double,String>> it = entry.iterator();it.hasNext();) {
Entry<Double, String> entry2 = it.next();
System.err.println("KEY:"+entry2.getKey()+" "+"VALUE:"+entry2.getValue());
}
}
------------------------------------
运行结果:
KEY:0.1003 VALUE:zhangsan
KEY:0.1102 VALUE:xiaohong
KEY:1.00031 VALUE:wangwu
KEY:1.1 VALUE:lisi
按照大小排序了

Ⅷ Java怎么实现HashMap或TreeMap以key值进行排序

HashMap本身是hash散列,做不到你说的排序。
TreeMap可以,是二叉树实现,自己实现一个Comparator。

Ⅸ 怎么将java中一个treeMap排序后的统计值,即键和值输出到文件

你可以参考下面的代码能够实现你的需求:
public static void main(String[] args) {
int [] number ={1,2,3,4,5,6,3,4,5,2,7,4,9,1,3,1,2,4,3,5};
TreeMap<Integer, Integer> treeMap=new TreeMap<Integer, Integer>();
for (int i = 0; i < number.length; i++) {
if(!treeMap.containsKey(number[i])){
treeMap.put(number[i], 1);
}else if(treeMap.containsKey(number[i])) {
treeMap.put(number[i], treeMap.get(number[i])+1);
}
System.out.println(number[i]+","+treeMap.get(number[i]));
}
int [][] resultNumber=new int [treeMap.size()][2];
int index=0;
for(Integer n : treeMap.keySet()){
resultNumber[index][0]=n;
resultNumber[index][1]=treeMap.get(n);
index++;
}
for (int i = 0; i < resultNumber.length; i++) {
System.out.println("Number is :" +resultNumber[i][0]+" Number count is : "+resultNumber[i][1]);
}
}

Ⅹ 请教java中的TreeMap如何顺序按照插入顺序排序

treemap是按照键的顺序排序,可以通过实现comparator接口,重写compare方法来自定义排序

阅读全文

与javatreemap排序相关的资料

热点内容
app内页面的网址怎么提取 浏览:286
安卓升级包pkg文件如何打开 浏览:77
id3算法原理 浏览:602
骑手通app怎么输入不了保单号 浏览:988
82一56的筒便算法 浏览:404
数控机床fanuc编程 浏览:607
天刀mode不是内部或外部命令 浏览:854
长城c30压缩机价格 浏览:1000
java打开图片文件 浏览:409
跟程序员聊天聊到半夜 浏览:411
自己怎么做app代码 浏览:915
win7旗舰版进不去带命令符 浏览:799
单片机温度检测电路 浏览:802
拼图软件不压缩 浏览:656
红袖添香小说源码 浏览:624
erp加密工具在哪里买 浏览:516
怎么给qq群里的文件加密 浏览:762
androidsetbitmap 浏览:597
mt4反向编译 浏览:201
sun服务器命令 浏览:827