映射Map
映射Map
存储(键,值) 数据对的数据结构(key,value)
根据键(Key),寻找值(Value)
非常容易使用链表或者二分搜索树实现
//二分搜索树
class Node{
E e;
Node left;
Noder right;
}
//链表
class Node{
E e;
Node next;
}
基于Map
//二分搜索树
class Node{
K key;
V value;
Node left;
Noder right;
}
//链表
class Node{
K key;
V value;
Node next;
}
映射接口
Map<K,V>
void add(K,V)
V remove(K)//删除Key对应的键值 返回被删除值
boolean contains(K)
V get(K)//传入某个键 返回值
void set(K,V)//修改操作 给定一个键 修改对应值
int getSize()
boolean isEmpty()
基于链表的 映射Map
public class LinkedListMap<K,V> implements Map<K,V> {
private class Node{
public K key;
public V value;
public Node next;
public Node (K key ,V value,Node next){
this.key = key;
this.next =next;
this.value = value;
}
public Node (K key){this(key,null,null);}
public Node (){this(null,null,null);}
@Override
public String toString(){
return this.key.toString()+":"+this.value.toString();
}
}
private Node dummyHead;
private int size;
public LinkedListMap(){
dummyHead = new Node();
size = 0;
}
@Override
public void add(K key, V value) {
Node cur = getNode(key);
if(cur==null){
dummyHead.next = new Node(key,value,dummyHead.next);
size++;
}
else{
cur.value = value;
}
}
@Override
public V remove(K key) {
Node cur =dummyHead.next;
for(int i =0;i<size;i++){
if(cur.next.key.equals(key)){
cur.next = cur.next.next;
Node reval = cur.next;
reval.next =null;
size--;
return reval.value;
}
cur=cur.next;
}
return null;
}
@Override
public boolean contains(K k) {
return getNode(k)!=null;
}
@Override
public V get(K k) {
Node node =getNode(k);
return node == null ? null : node.value;
}
@Override
public void set(K k, V v) {
Node node =getNode(k);
if(node == null){
throw new IllegalArgumentException(k + "is not exist");
}
node.value = v;
}
@Override
public int getSize() {
return size;
}
@Override
public boolean isEmpty() {
return size == 0;
}
private Node getNode(K key){
Node cur =dummyHead.next;
while(cur != null){
if(cur.key.equals(key))
return cur;
cur =cur.next;
}
return null;
}
}
基于二分搜索树
public class BSTMap<K extends Comparable<K>,V> implements Map<K,V> {
private class Node{
public K key;
public V value;
public Node left;
public Node right;
public Node (K key ,V value,Node left,Node right){
this.key = key;
this.value = value;
this.left = left;
this.right = right;
}
public Node (K key){this(key,null,null,null);}
public Node (K key,V value){this(key,value,null,null);}
public Node (){this(null,null,null,null);}
@Override
public String toString(){
return this.key.toString()+":"+this.value.toString();
}
}
private Node root;
private int size;
public BSTMap(){
root = null;
size = 0;
}
@Override
public void add(K key, V value) {
root = add(root,key,value);
}
//向二分搜索树添加
private Node add(Node node,K key,V value){
if( node==null){
size ++;
return new Node(key,value);
}
if(key.compareTo(node.key) > 0)
node.right = add(node.right,key,value);
else if(key.compareTo(node.key)<0)
node.left = add(node.left,key,value);
else
node.value = value;
return node;
}
@Override
public V remove(K key) {
return remove(root,key).value;
}
private Node remove(Node node ,K k){
if(node ==null)
return null;
if(k.compareTo(node.key)>0){
node.right = remove(node.right,k);
return node;}
if(k.compareTo(node.key)<0){
node.left = remove(node.left,k);
return node;}
else{
if(node.left ==null){
Node rightNode =node.right;
node.right =null;
size --;
return rightNode;
}
if(node.right == null){
Node leftNode =node.left;
node.right =null;
size --;
return leftNode;
}
Node successor = minimum(node.right);
successor.right = removeMinimum(node.right);
successor.left =node.left;
node.left =node.right =null;
return successor;
}
}
public V minimum(){
if(size == 0)
throw new IllegalArgumentException("BST is empty");
return minimum(root).value;
}
private Node minimum(Node node) {
if (node.left == null)
return node;
return minimum(node.left);
}
private Node removeMinimum(Node node) {
if(node == null)
return null;
node.left = removeMinimum(node.left);
return node;
}
private Node removeMin(Node node) {
if(node.left == null){
Node rightNode = node.right;
node.right =null;
size --;
return rightNode;
}
node.left = removeMin(node.left);
return node;
}
@Override
public boolean contains(K k) {
Node node =getNode(root,k);
return node!=null;
}
@Override
public V get(K k) {
Node node = getNode(root,k);
return node ==null? null:node.value;
}
private Node getNode(Node node,K key) {
if (node == null)
return null;
if (key.compareTo(node.key) < 0)
return getNode(node.left, key);
else if(key.compareTo(node.key) > 0)
return getNode(node.right, key);
else
return node;
}
@Override
public void set(K k, V v) {
Node node =getNode(root,k);
if(node == null)
throw new IllegalArgumentException(k + "doesn't exist");
node.value = v;
}
@Override
public int getSize() {
return size;
}
@Override
public boolean isEmpty() {
return size == 0;
}
}

浙公网安备 33010602011771号