今天我在这里利用链表实现一个Java常用集合中Map(K,V),map对于学java的都应该熟知,map用来解决高效的分拣、快速的读取有很大的帮助。
接下来,我就直接贴上我的代码
Map接口:
public interface Map<K,V>{
//增加
void add(K key,V value);
//移除
V remove(K key);
//是否包含
boolean contains(K key);
//根据键获取值
V get(K key);
//设置值
void set(K key,V newValue);
//得到长度
int getSize();
//判断是否为空
boolean isEmpty();
}
实现类:LinkedListMap
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.value=value;
this.next=next;
}
public Node(K key){
this(key,null,null);
}
public Node(){
this(null,null,null);
}
@Override
public String toString() {
return key.toString()+":"+value.toString();
}
}
private Node head;//头指针
private int size;//size
public LinkedListMap(){
head=new Node();//初始化头结点
size=0;//默认的长度为0
}
//根据key找到node
private Node getNode(K key){
Node tempNode=head.next;
while(tempNode!=null){
if(tempNode.key.equals(key)){
return tempNode;
}
tempNode=tempNode.next;
}
return null;
}
//加入值
@Override
public void add(K key, V value) {
Node node = getNode(key);
if(null==node){
head.next=new Node(key,value,head.next);
size++;
}else{
node.value=value;
}
}
//根据键删除值
@Override
public V remove(K key) {
Node preNode = head;
while(preNode.next!=null){
if(preNode.next.key.equals(key)){//找到了
break;
}
preNode=preNode.next;
}
if(preNode.next!=null){
Node delNode=preNode.next;
preNode.next=delNode.next;
delNode.next=null;
size--;
return delNode.value;
}else{
throw new IllegalArgumentException("删除失败,key不存在");
}
}
//是否包含某个键
@Override
public boolean contains(K key) {
return getNode(key)!=null;
}
//获取值
@Override
public V get(K key) {
Node node = getNode(key);
return node==null?null:node.value;
}
//设置值
@Override
public void set(K key, V newValue) {
Node node = getNode(key);
if (null!=node) {
node.value=newValue;
}else {
throw new IllegalArgumentException(key+" doesn't exist");
}
}
//获取值
@Override
public int getSize() {
return size;
}
//判断是否为空
@Override
public boolean isEmpty() {
return size==0;
}
//简单的toString
@Override
public String toString() {
StringBuilder stringBuilder=new StringBuilder();
stringBuilder.append("LinkedListMap:");
Node tempNode=head.next;
while(tempNode!=null){
stringBuilder.append("[key:"+tempNode.key+" value:"+tempNode.value+"],");
tempNode=tempNode.next;
}
return stringBuilder.toString();
}
}
测试类:Main
public class Main {
public static void main(String[] args) {
LinkedListMap map=new LinkedListMap();
map.add("1","1");
map.add("2","2");
map.add("3","3");
map.add("4","4");
System.err.println("key:2 value:"+map.get("2"));
System.err.println("size: "+map.getSize());
map.remove("2");
System.err.println(map);
}
}
测试结果:
有兴趣的伙伴可以自行测试代码,提升自我,大家加油!!!