ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

20220726_第七小组_张红睿_Java帝国_符号表

2022-07-26 22:02:41  阅读:189  来源: 互联网

标签:tmp Node Java 20220726 next key 符号表 null public


Java帝国之实现无/有序符号表

​ 符号表最主要的目的是将一个键和一个值联系起来,通过查找键的方式找到对应的值。其中键具有唯一性。

如座位号、图书编号等,具有一一对应的关系。

1. 无序符号表

public class SymbolTable<Key, Value> {

    private Node head; // 首节点
    private int N;     // 长度

    public SymbolTable(){
        head = new Node<>();
    }

    private class Node<Key, Value>{
        public Key key;     // 键
        public Value value; // 值
        public Node next;   // 下指针

        public Node(){}
        public Node(Key key, Value value){
            this.key = key;
            this.value = value;
        }
    }

    /**
     * 根据键,返回对应值
     * @param key   键
     * @return      值
     */
    public Value get(Key key){
        Node tmp = this.head;
        while (tmp.next != null && !tmp.next.key.equals(key))
            tmp = tmp.next;
        return tmp.next == null ? null : (Value)tmp.next.value;
    }

    /**
     * 向符号表中插入一个键值对
     * 注意:键具有唯一性!!! 如果插入的键key已存在则覆盖值value
     * @param key   键
     * @param val   值
     */
    public void put(Key key, Value val){
        Node tmp = this.head;
        while(tmp.next != null && !tmp.next.key.equals(key)){
            tmp = tmp.next;
        }
        if(tmp.next != null && tmp.next.key.equals(key)){
            tmp.next.value = val;
            return;
        }
        Node<Key, Value> newNode = new Node<>(key, val);
        newNode.next = tmp.next;
        tmp.next = newNode;
        this.N++;
    }

    /**
     * 删除指定键的键值对 不存在不删除
     * @param key
     */
    public void delete(Key key){
        Node tmp = this.head;
        while (tmp.next != null && !tmp.next.key.equals(key))
            tmp = tmp.next;
        if(tmp.next == null)
            return;
        if(tmp.next.next != null)
            tmp.next = tmp.next.next;
        else tmp.next = null;
        this.N--;
    }

    public int size(){
        return this.N;
    }

    public boolean isEmpty(){
        return this.N == 0;
    }

    @Override
    public String toString() {
        StringBuilder stringBuilder = new StringBuilder();
        Node tmp = this.head;
        while (tmp.next != null){
            tmp = tmp.next;
            stringBuilder.append("key: ").append(tmp.key).append(" value: ").append(tmp.value).append("\n");
        }
        return stringBuilder.toString();
    }
}

测试:

public class SymbolTableTest {
    public static void main(String[] args) {
        //创建符号表对象
        SymbolTable<Integer, String> symbolTable = new SymbolTable<>();

        //测试put方法(插入,替换)
        symbolTable.put(1,"乔峰");
        symbolTable.put(2,"虚竹");
        symbolTable.put(3,"段誉");
        System.out.println("插入完毕后,元素的个数为:" + symbolTable.size());
        System.out.println(symbolTable);

        symbolTable.put(2, "慕容复");
        System.out.println("替换完毕后的元素的个数为:" + symbolTable.size());
        System.out.println(symbolTable);

        //测试get方法
        System.out.println("替换完毕后,键2对应的值为:" + symbolTable.get(0));
        System.out.println(symbolTable);

        //测试删除方法
        symbolTable.delete(2);
        System.out.println("删除完毕后,元素的个数:" + symbolTable.size());
        System.out.println(symbolTable);
    }
}

2. 有序符号表

package com.jsoft.work;

public class OrderSymbolTable<Key, Value> {

    private Node head;  // 首节点
    private int N;      // 长度

    public OrderSymbolTable(){
        this.head = new Node<>();
    }

    private class Node<Key, Value>{
        public Key key;        // 键
        public Value value;    // 值
        public Node next;      // 下指针

        public Node(){}
        public Node(Key key, Value value){
            this.key = key;
            this.value = value;
        }
    }

    /**
     * 根据键,返回对应值
     * @param key   键
     * @return      值
     */
    public Value get(Key key){
        Node tmp = this.head;
        while (tmp.next != null && !tmp.next.key.equals(key))
            tmp = tmp.next;
        return tmp.next == null ? null : (Value) tmp.next.value;
    }

    /**
     * 向符号表中按照键的升序插入一个键值对
     * 注意:键具有唯一性!!! 如果插入的键key已存在则覆盖值value
     * @param key   键
     * @param val   值
     */
    public void put(Key key, Value val){
        Node tmp = this.head;
        while (tmp.next != null && String.valueOf(tmp.next.key).compareTo(String.valueOf(key)) < 0)
            tmp = tmp.next;
        if(tmp.next != null && tmp.next.key.equals(key)){
            tmp.next.value = val;
            return;
        }
        Node<Key, Value> newNode = new Node<>(key, val);
        newNode.next = tmp.next;
        tmp.next = newNode;
        this.N++;
    }

    /**
     * 删除指定键的键值对 不存在不删除
     * @param key
     */
    public void delete(Key key){
        Node tmp = this.head;
        while (tmp.next != null && !tmp.next.key.equals(key))
            tmp = tmp.next;
        if(tmp.next == null)
            return;
        if(tmp.next.next != null)
            tmp.next = tmp.next.next;
        else tmp.next = null;
        this.N--;
    }

    public int getN() {
        return this.N;
    }

    public boolean isEmpty(){
        return this.N == 0;
    }

    @Override
    public String toString() {
        StringBuilder stringBuilder = new StringBuilder();
        Node tmp = this.head;
        while (tmp.next != null){
            tmp = tmp.next;
            stringBuilder.append("key: ").append(tmp.key).append(" value: ").append(tmp.value).append("\n");
        }
        return stringBuilder.toString();
    }
}

测试:

public class OrderSymbolTableTest {
    public static void main(String[] args) {
        //创建有序符号表对象
        OrderSymbolTable<Integer, String> table = new OrderSymbolTable<>();
        table.put(1,"张三");
        table.put(2,"李四");
        table.put(4,"赵六");
        table.put(7,"田七");
        table.put(3,"王五");
        System.out.println(table);
    }
}

标签:tmp,Node,Java,20220726,next,key,符号表,null,public
来源: https://www.cnblogs.com/blog-J/p/16522804.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有