3.1.1 #
解答 #
官方解答: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
。
代码 #
public class St<TKey, TValue> : ISt<TKey, TValue>, IEnumerable<TKey>
{
private readonly Dictionary<TKey, TValue> _st;
/// <summary>
/// 新建一个符号表。
/// </summary>
public St() => _st = new Dictionary<TKey, TValue>();
/// <summary>
/// 检查符号表中是否存在与键 <paramref name="key"/> 对应的值。
/// </summary>
/// <param name="key">要检查是否存在的键。</param>
/// <returns>如果存在则返回 <c>true</c>,否则返回 <c>false</c>。</returns>
public virtual bool Contains(TKey key) => _st.ContainsKey(key);
/// <summary>
/// 从符号表中删除键 <paramref name="key"/> 及对应的值。
/// </summary>
/// <param name="key">要删除的键。</param>
public virtual void Delete(TKey key) => _st.Remove(key);
/// <summary>
/// 获取键 <paramref name="key"/> 对应的值,不存在时返回 null。
/// </summary>
/// <param name="key">要查找的键。</param>
/// <returns>键 <paramref name="key"/> 对应的值,不存在则返回 <c>default(Value)</c>。</returns>
public virtual TValue Get(TKey key) => _st[key];
/// <summary>
/// 获取枚举器。
/// </summary>
/// <returns>符号表的枚举器。</returns>
public IEnumerator<TKey> GetEnumerator() => _st.Keys.GetEnumerator();
/// <summary>
/// 检查符号表是否为空。
/// </summary>
/// <returns>如果符号表为空则返回 <c>true</c>,否则返回 <c>false</c>。</returns>
public virtual bool IsEmpty() => _st.Count == 0;
/// <summary>
/// 获得符号表中所有键的集合。
/// </summary>
/// <returns>包含符号表中所有键的集合。</returns>
public virtual IEnumerable<TKey> Keys() => _st.Keys;
/// <summary>
/// 向符号表中插入新的键值对。
/// </summary>
/// <param name="key">要插入的键。</param>
/// <param name="value">对应的值。</param>
public virtual void Put(TKey key, TValue value)
{
if (_st.ContainsKey(key))
_st[key] = value;
else
_st.Add(key, value);
}
/// <summary>
/// 获取符号表中键值对的数量。
/// </summary>
/// <returns>符号表中键值对的数量。</returns>
public virtual int Size() => _st.Count;
/// <summary>
/// 获取枚举器。
/// </summary>
/// <returns>符号表的枚举器。</returns>
/// <remarks>实际上调用的是 <see cref="GetEnumerator"/>。</remarks>
IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
}