我想我需要一些关于我的集合类的反馈 - 仍然学习typescript和javascript,这些实现肯定可以改进。我期待着任何建议。我认为我确实以有用的方式使用泛型类型,这里的任何建议都会受到赞赏。
我最需要的答案是从两个片段的末尾删除重复的IHashTable定义并将其移动到自己的文件,我似乎无法完成。我甚至不确定这是否是一个接口。就我所见,它以这种方式编译和工作。
集合类型不完整,目前只定义了最基本的功能。一旦我确定我使用该语言及其功能正确,其他功能应该不会太困难。
这是我的HashSet:
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;
}
我想知道我是否可以避免以某种方式进行检查。这依赖的javascript-dictionary确实允许重复,所以为了避免它们除了检查自己之外别无他法?
这是我的词典:
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;
}
两者都依赖于IHashable的定义(hashABLE和hashTABLE:我应该找到其他名称。)
export interface IHashable {
GetHash(): string;
}
字典看起来有点奇怪,它包裹着#34;将我的字典转换为新类型的KeyValuePair,然后在javascript字典中使用它。我希望通过这样做获得的是获得我自己的键,输入和输出类型,只要它提供了一个可以被索引的字符串。 - 不知道这是否有意义或完全错误。
我缺少的是集合中的项目数,删除项目的方法,以及迭代键和值的方法。 关于迭代,我将发布另一个问题,我实现了一个列表和一个ForEach,希望以相同的方式迭代键或值。
可能是我在这里忘记的最重要的问题:如何为自己的类构建GetHash-Method?我将在我的类上有一个静态数字,并在构造函数中向上计数1,然后将此数字分配给每个实例。这样可以保证唯一性......还有更好的东西吗?
感谢您的提示! 拉尔夫