3.1.1

上次更新:2019-04-17
发现了题解错误/代码缺陷/排版问题?请点这里:如何:提交反馈

解答

官方解答:https://algs4.cs.princeton.edu/31elementary/GPA.java.html
ST.java:https://algs4.cs.princeton.edu/code/edu/princeton/cs/algs4/ST.java.html

建立一个符号表,然后把键值放进去,读取计算即可。
和上一章节用过的方法类似,先定义了一个接口 IST<Key, Value> ,包含书中提到的基本 API。
然后定义类 ST ,用标准库里面的 Dictionary 实现了 IST

代码

using System.Collections;
using System.Collections.Generic;

namespace SymbolTable
{
    /// <summary> 利用库函数实现的标准符号表。 </summary>
    public class ST<Key, Value> : IST<Key, Value>, IEnumerable<Key>
    {
        private Dictionary<Key, Value> st;

        /// <summary> 新建一个符号表。 </summary>
        public ST() => this.st = new Dictionary<Key, Value>();

        /// <summary> 检查符号表中是否存在与键 <paramref name="key"/> 对应的值。 </summary>
        public virtual bool Contains(Key key) => this.st.ContainsKey(key);

        /// <summary> 从符号表中删除键 <paramref name="key"/> 及对应的值。 </summary>
        public virtual void Delete(Key key) => this.st.Remove(key);

        /// <summary> 获取键 <paramref name="key"/> 对应的值,不存在时返回 null。 </summary>
        public virtual Value Get(Key key) => this.st[key];

        /// <summary> 获取枚举器。 </summary>
        public IEnumerator<Key> GetEnumerator() => this.st.Keys.GetEnumerator();

        /// <summary> 检查符号表是否为空。 </summary>
        public virtual bool IsEmpty() => this.st.Count == 0;

        /// <summary> 获得符号表中所有键的集合。 </summary>
        public virtual IEnumerable<Key> Keys() => this.st.Keys;

        /// <summary> 向符号表中插入新的键值对。 </summary>
        public virtual void Put(Key key, Value value) => this.st.Add(key, value);

        /// <summary> 获取符号表中键值对的数量。 </summary>
        public virtual int Size() => this.st.Count;

        /// <summary> 获取枚举器。 </summary>
        IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
    }
}

另请参阅

SymbolTable 库

上一题 下一题