[疯狂Java]集合:SortedMap、TreeMap、equals/compareTo的标准写法

翻译 2016年05月31日 21:00:43

1. SortedMap的实现类——TreeMap:

    1) 就像SortedSet的实现类TreeSet一样,TreeMap的数据结构完全和SortedSet一样,用红黑树实现;

    2) TreeMap和TreeSet比较之后的特点就是:

         i. 是根据Entry的key的大小进行排序(对Entry进行排序),即用key来代表Entry的大小;

         ii. 自然排序需要实现key的compareTo,定制排序(构造器传一个Comparable闭包)也是根据key进行比较的:TreeMap(Comparator<? super K> comparator);

         iii. 实现时也需要保证key的equals和compare的结果一致,如果不一致则存储Entry时会导致和Map的规则冲突;


2. TreeMap的对象方法:基本和TreeSet的形式一样的,只不过方法名的后缀是Key、Entry、Map

    1) first/last系列:分别提供了检索entry和key的方法

         i. Map.Entry<K,V> firstEntry | lastEntry();  // 获取第一个/最后一个entry

         ii. K firstKey | lastKey();  // 获取第一个/最后一个entry的键

    2) lower/higher系列:也是分别提供了检索entry和key的方法

         i. Map.Entry<K,V> lowerEntry | higherEntry(K key);  // 获取比指定key所对应的entry小/大一位的entry

         ii. K lowerKey | higherKey(K key);  // 获取比指定key大/小一位的key

    3) head/tail/sub系列(获取子区间):返回的都是SortedMap(即纯子集)

         i. SortedMap<K,V> headMap(K toKey);  // 所有小于toKey(不包括toKey)的子集

         ii. SortedMap<K,V> tailMap(K fromKey);  // 所有大于等于fromKey的子集

         iii. SortedMap<K,V> subMap(K fromKey, K toKey);  // 返回[fromKey, toKey)区间的子集

    4) 示例:

class R implements Comparable {
	int val;

	public R(int val) {
		this.val = val;
	}

	@Override
	public String toString() {
		return "R[val:" + val + "]";
	}

	@Override
	public boolean equals(Object obj) { // equals的标准写法
		if (this == obj) { // 先比较地址
			return true;
		}
		
		if (obj != null && obj.getClass() == R.class) { // 再比较类型(前提是obj不能为空)
			R r = (R)obj; // 先把类型调整一致(当然可以直接return this.val == ((R)obj).val
						  // 但如果在return之前还要用obj进行一些其它复杂操作那用临时的类型转换太麻烦了
			              // 因此先协调类型才是最标准最合理的做法
			return this.val == r.val;
		}
		
		return false; // 地址不同 || obj为空 || 类型不一致,那肯定不一样了!
	}
	
	@Override
	public int compareTo(Object o) { // compareTo的标准写法
		if (this == o) { // 第一步和equals一样,还是先比较地址,这是最基本也是最容易想到的
			return 0;
		}
		
		if (o == null) { // 由于compareTo比较的是大小,而null是没法比较大小的,因此null就得抛异常
			             // 这里只是个演示,就不实现这一块了
			// 抛出异常
		}
		
		R r = (R)o; // 不判断类型是否一致,不一致直接抛出异常!就是要暴露异常方便调试(集合中元素都应该保证类型相同)
		
		return this.val - r.val; // 正常的操作和返回
	}
}

public class Test {
	
	public static void main(String[] args) {
		TreeMap map = new TreeMap();
		
		map.put(new R(9), "aaa");
		map.put(new R(5), "bbb");
		map.put(new R(-3), "ccc");
		System.out.println(map); // key: -3, 5, 9
		
		System.out.println(map.firstEntry()); // key: -3
		System.out.println(map.lastKey()); // key: 9
		System.out.println(map.higherKey(new R(2))); // key: 5
		System.out.println(map.lowerEntry(new R(1))); // key: -3
		System.out.println(map.subMap(new R(-1), new R(10))); // key: 5, 9
	}
}


SortedMap的用法

package Map; import java.util.HashMap; import java.util.Iterator; import java.util.Set; import java...
  • xb12369
  • xb12369
  • 2015年05月14日 09:45
  • 14050

SortedMap和TreeMap

接口SortedMap public interface SortedMap extends Map  保证按照键的升序排列的映射,可以按照键的自然顺序(参见 Comparable 接口)进行排...
  • hudashi
  • hudashi
  • 2011年11月07日 17:01
  • 37695

利用SortedMap对HashMap进行排序

HashMap map=new HashMap(); map.put("1","1"); map.put("2", "2"); map.put("3", "3"); /* for (Map.En...
  • seek_knowledge_lulu
  • seek_knowledge_lulu
  • 2017年05月25日 17:21
  • 166

java SortedMap 升序、降序操作

参考: http://blog.csdn.net/xiaoyu714543065/article/details/38519817 #############################...
  • u012005313
  • u012005313
  • 2015年09月21日 11:18
  • 8062

Java 集合SortedSet&SortedMap讲解

把每天重复的工作做好,把每次遇到的困难解决。 这次对java集合框架学习中的两个特殊的接口进行介绍:SortedSet和SortedMap, 这两个接口提供排序操作,实现他们的子类都具有接口中...
  • u010126792
  • u010126792
  • 2017年03月15日 19:24
  • 1269

Java类集 _SortedMap接口

掌握SortedMap 接口的作用 回顾:SortedSet,是TreeSet 的实现接口,那么此接口可以进行排序的操作 SortedMap 也是排序的操作,之前学习过 TreeMap 类,那么此...
  • hanshileiai
  • hanshileiai
  • 2011年09月08日 17:50
  • 8604

为什么我们需要一个TreeMap中/ TreeSet中,当我们有SortedMap的/ SortedSet的?

1.接口不提供任何函数,它们只是定义在它提供的术语类的大致profile。但里面没有代码SortedMap/SortedSet那如何真正实现这一函数。 而作为事实上,你经常可以有多种方式来实现函数...
  • chadedaxia
  • chadedaxia
  • 2016年07月28日 11:32
  • 120

java源码分析之集合框架SortedMap 、 NavigableMap 、Dictionary 09

SortedMap SortedMap也是一个接口,继承与Map接口,Sorted表示它是一个有序的键值映射。 SortedMap的排序方式有两种:自然排序和指定比较器排序。插...
  • wangnanwlw
  • wangnanwlw
  • 2016年09月19日 17:56
  • 626

使用SortedMap对HashMap排序

HashMap map=new HashMap(); map.put("1","11"); map.put("2", "22"); map.put("3", "33"); fo...
  • lishengbo
  • lishengbo
  • 2011年02月18日 15:33
  • 16393

java 集合 TreeMap 键是对象,TreeMap中要重写compareTo方法

import java.util.TreeMap; //键是对象,TreeMap中要重写compareTo(对应着要重写toString方法)方法,否则会出现异常; public class ...
  • baidu_32731497
  • baidu_32731497
  • 2015年11月25日 15:01
  • 1357
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:[疯狂Java]集合:SortedMap、TreeMap、equals/compareTo的标准写法
举报原因:
原因补充:

(最多只允许输入30个字)