Dictionary TypeScript中的哈希集和字典:接口的导出
我想我需要一些关于我的收集类的反馈——仍在学习typescript和javascript,这些实现肯定可以改进。我期待任何建议。我想我确实以一种有用的方式使用了泛型类型,这里的任何建议都将不胜感激 我最想要的答案是从两个代码段的末尾删除重复的IHashTable定义,并将其移动到自己的文件中,我似乎无法做到这一点。我甚至不确定这是否是一个接口放在首位。据我所知,它是这样编译和工作的 集合类型不完整,目前仅定义基本的most函数。一旦我确定我使用的语言及其功能正确,其他功能就不会太难了 这是我的哈希集:Dictionary TypeScript中的哈希集和字典:接口的导出,dictionary,typescript,collections,hashset,Dictionary,Typescript,Collections,Hashset,我想我需要一些关于我的收集类的反馈——仍在学习typescript和javascript,这些实现肯定可以改进。我期待任何建议。我想我确实以一种有用的方式使用了泛型类型,这里的任何建议都将不胜感激 我最想要的答案是从两个代码段的末尾删除重复的IHashTable定义,并将其移动到自己的文件中,我似乎无法做到这一点。我甚至不确定这是否是一个接口放在首位。据我所知,它是这样编译和工作的 集合类型不完整,目前仅定义基本的most函数。一旦我确定我使用的语言及其功能正确,其他功能就不会太难了 这是我的哈
import { IHashable } from "./IHashable"
export class HashSet<T extends IHashable> {
private _items: HashTable<T>;
public constructor() {
this._items = {};
}
public Add(key: T): void {
let str: string = key.GetHash();
if (this._items[str] == null) {
this._items[str] = key;
}
else {
throw new RangeError("Key '" + str + "' already exists.");
}
}
public Contains(key: T): boolean {
let str: string = key.GetHash();
return this._items[str] != null;
}
}
interface HashTable<T> {
[key: string]: T;
}
字典看起来有点奇怪,它将我的字典“包装”成一个新类型的KeyValuePair,然后在javascript字典中使用它。通过这样做,我希望得到的是我自己的键类型,输入和输出,只要它提供一个字符串,它可以被索引。-不知道这是有道理的还是完全错误的
我缺少的是集合中的项目计数、删除项目的方法以及迭代键和值的方法。
关于迭代,我将发布另一个问题,并在上面实现一个列表和一个ForEach,希望以同样的方式迭代键或值
可能是我在这里忘记的最重要的问题:如何为自己的类构建GetHash方法?我的类中有一个静态数字,在将这个数字分配给每个实例之前,在构造函数中加1。这将保证独特性。。。有更好的吗
谢谢你给我小费!
拉尔夫正如我在你的另一个问题中提到的,这似乎太宽泛了,无法在下面给出有意义的答案。尝试实现自己的集合类型当然是一个有趣的练习。我看到的一个主要危险信号是,集合只能包含一个具有给定哈希值的元素。我所见过的其他映射/集实现都不是这样的。要修复它,您需要存储一个元素数组作为
哈希表
值类型。尝试实现自己的集合类型当然是一个有趣的练习。我看到的一个主要危险信号是,集合只能包含一个具有给定哈希值的元素。我所见过的其他映射/集实现都不是这样的。要修复它,需要将元素数组存储为哈希表
值类型。
import { IHashable } from "./IHashable"
export class Dictionary<T1 extends IHashable, T2> {
private _items: HashTable<KeyValuePair<T1, T2>>;
public constructor() {
this._items = {};
}
public Add(key: T1, value: T2) {
let str: string = key.GetHash();
if (this._items[str] == null) {
let kvp: KeyValuePair<T1, T2> = new KeyValuePair(key, value);
this._items[str] = kvp;
}
else {
throw new RangeError("Key '" + str + "' already exists.");
}
}
public ContainsKey(key: T1): boolean {
let str: string = key.GetHash();
return this._items[str] != null;
}
public Get(key: T1): T2 {
let str: string = key.GetHash();
let kvp: KeyValuePair<T1, T2> = this._items[str];
if (kvp == null) throw new RangeError("Key '" + str + "' not found")
return kvp.Value;
}
}
export class KeyValuePair<T1 extends IHashable, T2> {
private _key: T1;
private _value: T2;
public get Key(): T1 { return this._key; }
public get Value(): T2 { return this._value; }
public constructor(key: T1, value: T2) {
this._key = key;
this._value = value;
}
}
interface HashTable<T> {
[key: string]: T;
}
export interface IHashable {
GetHash(): string;
}