Java TreeMap的简单实现(转)

TreeMap的实现与二叉搜索树显示,其对应的节点格式为

Entry<K,V>   
Entry<K,V> left K key  V value Entry<K,V> parent Entry<K,V> left  

 

Entry作为TreeMap内部的一个是有类,TreeMap类的root来对其引用

 

TreeMap 的具体实现如下,(省略了迭代)

package com.woxiaoe.collection.map;

import java.util.Collection;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

import com.woxiaoe.collection.tree.STreeNode;
/**
 * TreeMap 的实现
 * @author 小e
 *
 * 2010-4-10 下午09:33:00
 */
public class TreeMap<K, V> implements Map<K, V> {
	private Entry<K, V> root;
	private int mapSize;
	private Set<K> keySet = null;
	public TreeMap() {
		root = null;
		mapSize = 0;
	}
	
	@Override
	public void clear() {
		// TODO Auto-generated method stub
		
	}

	@Override
	public boolean containsKey(Object key) {
		return getEntry((K) key) == null?false:true;
	}

	@Override
	public boolean containsValue(Object value) {
		// TODO Auto-generated method stub
		return false;
	}

	@Override
	public Set<java.util.Map.Entry<K, V>> entrySet() {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public V get(Object key) {
		Entry<K, V> entry = getEntry((K) key);
		if(entry != null){
			return entry.getValue();
		}
		return null;
	}

	@Override
	public boolean isEmpty() {
		return mapSize != 0;
	}

	@Override
	public Set<K> keySet() {
		if(keySet == null){
			keySet = new Set<K>() {

				@Override
				public boolean add(K e) {
					throw new UnsupportedOperationException("不支持该操作");
				}

				@Override
				public boolean addAll(Collection<? extends K> c) {
					throw new UnsupportedOperationException("不支持该操作");
				}

				@Override
				public void clear() {
					// TODO Auto-generated method stub
					
				}

				@Override
				public boolean contains(Object o) {
					
					return TreeMap.this.containsKey(o);
				}

				@Override
				public boolean containsAll(Collection<?> c) {
					for (Iterator iterator = c.iterator(); iterator.hasNext();) {
						K key = (K) iterator.next();
						if(TreeMap.this.containsKey(key)){
							return true;
						}
					}
					return false;
				}

				@Override
				public boolean isEmpty() {
					return TreeMap.this.size() != 0;
				}

				@Override
				public Iterator<K> iterator() {
					return null;
				}

				@Override
				public boolean remove(Object o) {
					throw new UnsupportedOperationException("不支持该操作");
				}

				@Override
				public boolean removeAll(Collection<?> c) {
					throw new UnsupportedOperationException("不支持该操作");
				}

				@Override
				public boolean retainAll(Collection<?> c) {
					// TODO Auto-generated method stub
					return false;
				}

				@Override
				public int size() {
					return TreeMap.this.size();
				}

				@Override
				public Object[] toArray() {
					// TODO Auto-generated method stub
					return null;
				}

				@Override
				public <T> T[] toArray(T[] a) {
					// TODO Auto-generated method stub
					return null;
				}
			};
		}
		return null;
	}

	@Override
	public V put(K key, V value) {
		Entry<K, V> entry = root,parent = null,newNode;
		int result = 0;
		while(entry != null){
			parent = entry;
			result = ((Comparable<K>)entry.getKey()).compareTo(key);
			if(result == 0){//更新
				entry.setValue(value);
				return value;
			}else if(result > 0){
				entry = entry.getLeft();
			}else{
				entry = entry.getRight();
			}
		}
		
		newNode = new Entry<K, V>(key, value, parent);
		if(parent == null){//根结点的情况
			root = newNode;
		}else if(result > 0){
			parent.setLeft(newNode);
		}else{
			parent.setRight(newNode);
		}
		mapSize ++;
		return value;
	}

	@Override
	public void putAll(Map<? extends K, ? extends V> m) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public V remove(Object key) {
		Entry<K, V> entry = getEntry((K) key);
		return remove(entry);
	}

	@Override
	public int size() {
		return mapSize;
	}

	@Override
	public Collection<V> values() {
		// TODO Auto-generated method stub
		return null;
	}
	/**
	 * 根据键的道一个Entry
	 * @param key
	 * @return
	 */
	private Entry<K, V> getEntry(K key){
		Entry<K, V> entry = root,returnEntry;
		int result = 0;
		while(entry != null){
			result = ((Comparable<K>)entry.getKey()).compareTo(key);
			if(result == 0){
				return entry;
			}else if(result > 0){
				entry = entry.getLeft();
			}else{
				entry = entry.getRight();
			}
		}
		
		return null;
		
	}
	/**
	 * 删除键值为key的键值对
	 * @param key
	 * @return
	 */
	private boolean removeEntry(K key){
		Entry<K, V> pEntry ,rEntry,entry = getEntry(key);//node的父节点,和node的子节点
		if(entry == null){
			return false;
		}
		/**
		 * 情况一,当节点至少有一棵空子树
		 */
		if(entry.getLeft() == null || entry.getRight() == null){
			pEntry = entry.getParent();
			
			if(entry.getLeft() == null){
				rEntry = entry.getRight();
			}else{
				rEntry = entry.getLeft();
			}
			
			if(rEntry != null){
				rEntry.setParent(pEntry);//将r的父节点指向p
			}
			
			if(pEntry == null){//node为root节点
				root = rEntry;
			}else if(((Comparable<K>)pEntry.getValue()).compareTo(entry.getKey()) < 0){
				pEntry.setRight(entry);
			}else{
				pEntry.setLeft(entry);
			}
		}else{
			rEntry = entry.getRight();
			pEntry = entry;
			
			/**
			 * 找到node的右子树中最大于node的最小值
			 */
			while(rEntry.getLeft() != null){
				pEntry = rEntry;
				rEntry = rEntry.getLeft();
			}
			/**
			 * 交换值
			 */
			entry.setValue(rEntry.getValue());
			
			if(pEntry == entry){//node 的下一结点 没有节点
				entry.setRight(rEntry.getRight());//
			}else{
				pEntry.setLeft(rEntry.getRight());
			}
			/**
			 * 将rNode的右子树 的 parent 接到pNode下
			 */
			if(rEntry.getRight() != null){
				rEntry.getRight().setParent(pEntry);
			}
		}
		return false;
	}
	private static class Entry<K,V> implements Map.Entry<K, V>{
		private K key;
		private V value;
		private Entry<K,V> left,right,parent;
		
		public Entry(K key,V value,Entry<K, V> parent) {
			this.key = key;
			this.value = value;
			this.parent = parent;
		}
		
		@Override
		public K getKey() {
			return this.key;
		}

		@Override
		public V getValue() {
			// TODO Auto-generated method stub
			return this.value;
		}

		@Override
		public V setValue(V value) {
			// TODO Auto-generated method stub
			return this.value = value;
		}

		public Entry<K, V> getLeft() {
			return left;
		}

		public void setLeft(Entry<K, V> left) {
			this.left = left;
		}

		public Entry<K, V> getRight() {
			return right;
		}

		public void setRight(Entry<K, V> right) {
			this.right = right;
		}

		public Entry<K, V> getParent() {
			return parent;
		}

		public void setParent(Entry<K, V> parent) {
			this.parent = parent;
		}
		
		
		
	}

}

 

测试类
package com.woxiaoe.collection.map;

import java.util.Iterator;
import java.util.Map;
import java.util.Random;
import java.util.UUID;

import junit.framework.TestCase;

public class TestTreeMap extends TestCase {
	Map<Integer,String> map = new TreeMap<Integer, String>();
	int key = 0;
	@Override
	protected void setUp() throws Exception {
		Random r = new Random();
		String uuid = "";
		
		for(int i = 0; i < 100; i++){
			uuid = UUID.randomUUID().toString();
			key = r.nextInt(100);
			map.put(key,uuid);
			System.out.println("i:" + key + "\t uuid:" + uuid);
		}
		
	}
	public void testTreeMap(){
		System.out.println(map.size());
		System.out.println(map.get(key));
	}
}
 

Output:

 

i:35 uuid:5af915cd-f2ef-4668-8943-e61a8f4a0cb1

i:61 uuid:d9a71475-5762-4042-aa71-0f2683b9f660

i:21 uuid:2fd94a4c-4349-4771-9ed5-13bf002aae31

i:83 uuid:c3df4e3a-5220-4ba4-a9ee-4f956017c65a

i:88 uuid:187da75d-031d-4404-a60c-da7100f5b2da

i:97 uuid:0d0539ff-4b28-4b4f-8dc1-380f47eff8a5

i:37 uuid:81ca72d1-5f36-4dbc-99c6-fab3663e094f

i:63 uuid:25dd2755-c1cf-4a24-a7df-5e41eb14a135

i:45 uuid:f4a9e3be-39d4-4d26-be46-cab1e4aa1fb3

i:36 uuid:da148390-cbf6-4c42-a838-7fdd6ba807a1

i:30 uuid:4defb70f-9f65-4b9f-bf6f-1899331949f5

i:83 uuid:ea68fd7a-4c0d-458a-bfcd-81670f4c241c

i:3 uuid:4f0ff3a3-fd85-4209-a70c-076151a148ab

i:96 uuid:079af274-55cc-4c99-8869-323d7f779934

i:84 uuid:ec3d66dc-4e4c-4feb-acbc-4391d888e7d0

i:61 uuid:708cbe70-1f4e-484f-b9f0-eda41d31a707

i:95 uuid:b46cbac3-fb5c-4585-94e7-7b7c4abff5a7

i:42 uuid:142f023f-f2d8-4bf8-a03f-037eeabb5525

i:92 uuid:002280b6-38aa-4d3d-862d-ab471fab6c08

i:2 uuid:01667bc2-5b00-4a00-8290-9b1170910d96

i:56 uuid:7e8e2c04-1e9d-4167-910f-17176268836a

i:92 uuid:2bd08afb-3393-463b-8bfa-fe534618ff0b

i:46 uuid:81e644a2-0860-46a8-92f2-27bb24ab49fa

i:54 uuid:4ef7ef0d-cc79-4b6d-9bc0-1002093cd11a

i:42 uuid:68b3d575-eba8-427e-85c5-d936bc706733

i:23 uuid:ffe53eee-27c9-4682-ad3b-ab701517fdf1

i:19 uuid:aeacdb2e-6c35-4ac9-b018-28bda7bcd331

i:71 uuid:b40dbc71-57b7-4a25-8326-48e8edf117ee

i:8 uuid:b66d7d6d-8ba9-4b6b-9d4a-ae83c7cbcedc

i:34 uuid:41acf8cd-3c4b-4648-be82-112768cf0534

i:45 uuid:3d4e2c9c-623f-4a36-9e5c-289ecaf331bb

i:84 uuid:108f025e-ac1e-42ef-8e5d-2eb30d84d055

i:87 uuid:e7807eba-eb28-4e9d-a0aa-096dd630b41f

i:69 uuid:292c8e45-f98d-4b17-9c79-c1ca58554819

i:51 uuid:f69a94eb-31ad-4530-8104-af54fff712a7

i:61 uuid:06d68660-e5c0-4a28-8b31-92027e530d65

i:15 uuid:c1b1fbb6-5ba7-4383-af99-ec3a3ad35249

i:85 uuid:d68a7b8c-e401-4d7b-beb6-d269746b467a

i:84 uuid:24fd275e-bcd6-41ea-a062-7963ecccbffc

i:93 uuid:8cc88b89-14e3-411a-b3a2-9b1237ccf073

i:3 uuid:2b51c761-790c-4f2e-bb06-fea6b173edad

i:48 uuid:a4523cd5-896a-475f-98cc-762e4b5bc84d

i:91 uuid:d3dbf038-7045-42f1-8680-5d64b2d1218f

i:53 uuid:3a0ad304-a5ab-4e78-a35c-82734da03f9e

i:69 uuid:e9d22302-e28a-4814-8f1b-16b6606bb4bd

i:93 uuid:fc51a87b-8e9a-4a83-99e0-9245d8504038

i:45 uuid:00ad6c40-0831-453b-8fd8-028131f2fe6b

i:88 uuid:1f5d411e-f7e8-41cb-8c6a-005a26dacbd2

i:96 uuid:02ecd981-e4bd-4299-a7de-ced2c00bfc75

i:19 uuid:ce25c27c-7c90-448d-a0cd-08ed1728652e

i:44 uuid:7e3ce4ea-1483-48ef-95a0-1a44f50f5de4

i:49 uuid:76c9a712-104f-46d3-92dd-24a155e68632

i:62 uuid:afd8b6f0-9da6-418f-8a94-ffc02683ac26

i:43 uuid:487c19b2-2bce-4818-8827-e754fbd1c749

i:76 uuid:5a85fc2e-5bd5-48eb-b6d6-3b118d6da2ab

i:60 uuid:b024140b-5cff-4397-8306-fa9b06169812

i:87 uuid:74f2e878-2aed-4b1d-8932-fba5b2e7a401

i:46 uuid:0249b366-12e2-4c02-b220-db9525a15b63

i:32 uuid:d6fa08e4-6ff8-47c9-a35d-b0a7b02ff7f4

i:69 uuid:dc5d6ab0-4bae-4943-942f-8a88ae39a1c4

i:64 uuid:5b878280-ebba-404b-9b3d-7f68ae8908e7

i:60 uuid:d64da298-b2b9-456e-b0de-3b7d199d1ccc

i:67 uuid:6bc53a9a-fb5e-4c9d-bce4-5dacec428f1d

i:64 uuid:a7fab810-69b3-428d-a988-9fa31d173228

i:52 uuid:a806bf37-8d0f-422c-a93f-dc39a18f51b4

i:82 uuid:b9d21000-78c4-44a9-b324-2ae037146ab2

i:53 uuid:904b2e7d-7c27-469a-8ba6-841e42dff59a

i:58 uuid:372965d3-1e06-4bc6-b704-2e61759249dd

i:21 uuid:74f1ff1c-d1ca-4e2b-9c8b-347b55a82d13

i:17 uuid:e90294bb-b3fd-4536-b529-4d5985c67aca

i:97 uuid:90b522ba-1890-434c-9fa6-c60d3135d678

i:65 uuid:6dc42ff4-dec6-4e55-a71a-d308959602a9

i:59 uuid:215095ee-9a03-451f-be4c-621ced45a57d

i:23 uuid:2b080886-906b-407c-8ac4-7a163ab01934

i:45 uuid:35b73197-326d-4ebe-b1ce-3c00f83d86f8

i:89 uuid:b6b1680b-a0d4-4474-9613-441c26e38940

i:35 uuid:a8b7fe72-1c4a-4d63-888b-b1cd992bd7ed

i:97 uuid:49076b38-5f96-4bd5-be72-51e97d1da4e4

i:97 uuid:6e36536e-8172-4b9c-850a-f0b79478c992

i:27 uuid:31f7100b-8121-40af-ba4b-f470bb061c12

i:71 uuid:371f790b-e90d-47b6-b6fe-f58566aa2f24

i:4 uuid:66b880a5-53e5-4120-b48c-10f06833e233

i:33 uuid:7c3c223a-d49e-432c-85a8-0441b5574ac4

i:92 uuid:a27d5c94-8885-43c6-95b4-075f7033487d

i:14 uuid:aece1fb6-d821-40cb-9c35-17bac9a76b1c

i:83 uuid:ec831269-59c5-4234-99eb-513436fee57f

i:10 uuid:7dc45b5b-1a6b-4624-b95f-49856925080b

i:91 uuid:54faddab-037d-49fa-a112-09679cb621df

i:43 uuid:2618324a-2446-42c9-b828-71d93666456f

i:9 uuid:0ba9c5e4-00f0-4dcc-bd1a-74356e8c5828

i:40 uuid:ffe569b1-cf20-4103-9b80-da1b3b291e13

i:77 uuid:76807d50-3dc5-4603-9873-8a76e5823ad9

i:62 uuid:c0b48db7-eeb8-4c9f-82c7-be5d6448b4c4

i:59 uuid:e0a4df35-15ed-487f-b4b6-2be507c4b977

i:98 uuid:97563089-2577-4021-996e-3bfd7cc029af

i:86 uuid:ae8b79c1-c477-45f2-9b76-8c8bb5e13127

i:11 uuid:f783bc6e-ba17-41bb-9556-1f308b217397

i:24 uuid:077546ac-cafb-4618-8cb1-0dcdfde09df6

i:42 uuid:563ec38c-44c4-4b79-83c5-14b28a1d03b8

i:81 uuid:9de22af0-b78f-43d3-a52f-301c25f4588e

null

64

9de22af0-b78f-43d3-a52f-301c25f4588e


 载自:http://ideasforjava.iteye.com/blog/640931

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值