Java符号表和有序符号表的概念及实现

目录

基本概念

符号表API设计

采用链表实现

结点类​

符号表 ​

代码实现

测试代码

 结果

有序符号表


基本概念

最主要的目的就是将一个键和一个值联系起来。
定义:符号表是一种存储键值对的数据结构,支持插入(put)和查找(get)操作,即给定建得到相应的值。

  • 每个键只对应一个值
  • 向符号表中插入键值对,如果已存在就会替换原有的值

符号表API设计

  1. 采用链表实现

  2. 结点类

  3. 符号表 

 代码实现

package cn.itcast.algorithm.symbol;

public class SymbolTable<key,value> {

    private Node head;
    private int N;

    public class Node{
        //健
        public key key;
        //值
        public value value;
        //结点
        public Node next;
        public Node(key key,value value,Node next){
            this.key=key;
            this.value=value;
            this.next=next;
        }
    }

    public SymbolTable(){
        this.head=new Node(null,null,null);
        this.N=0;
    }

    public int size(){
        return N;
    }

    //插入键值对
    public void put(key key,value value){
        //如果符号表中存在健为key的键值对,则找到该结点替换value
        Node n=head;
        while(n.next!=null){
            n=n.next;
            if(n.key.equals(key)){
                n.value=value;
                return;
            }
        }
        //符号表中不存在,则新建一个结点,保存要插入的键值对
        Node newNode = new Node(key, value, null);
        Node oldFirst=head.next;
        head.next=newNode;
        newNode.next=oldFirst;

        N++;
    }

    //删除符号表中为key的键值对
    public void delete(key key){
        //找到健为key的键值对
        Node n=head;
        while(n.next!=null){
            if(n.next.key.equals(key)){
                n.next=n.next.next;
                N--;
                return;
            }

            n=n.next;
        }
    }

    //从符号表中找到key对对应的值
    public value get(key key){
        Node n=head;
        while(n.next!=null){
            n=n.next;
            if(n.key.equals(key)){
                return n.value;
            }
        }
        //遍历完,不存在时
        return null;
    }
}

测试代码

package cn.itcast.algorithm.symbol;

public class SymbolTableTest {
    public static void main(String[] args) {
        SymbolTable<Integer, String> S = new SymbolTable<>();

        //put
        S.put(1,"十号");
        S.put(2,"九号");
        S.put(3,"八号");
        System.out.println("元素个数为:"+S.size());

        S.put(2,"六号");
        System.out.println("替换完毕后元素个数:"+S.size());

        //get
        System.out.println("替换完毕后,健2对应的值:"+S.get(2));

        //delete
        S.delete(2);
        System.out.println("删除后元素个数:"+S.size());
    }
}

 结果

有序符号表

有序符号表的实现就是把符号表的put方法修改一下即可,插入按照符号表key的大小有顺序的放入

//有序
    public void put(key key,value value){
        Node curr=head.next;
        Node pre=head;
        while(curr!=null && key.compareTo(curr.key)>0){
            pre=curr;
            curr=curr.next;
        }
        //如果值一样就替换
        if(curr!=null && key.compareTo(curr.key)==0){
            curr.value=value;
            return;
        }
        Node newNode = new Node(key, value, curr);
        pre.next=newNode;

        N++;
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Pepsid

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值