Dictionary TypeScript中的哈希集和字典:接口的导出

Dictionary TypeScript中的哈希集和字典:接口的导出,dictionary,typescript,collections,hashset,Dictionary,Typescript,Collections,Hashset,我想我需要一些关于我的收集类的反馈——仍在学习typescript和javascript,这些实现肯定可以改进。我期待任何建议。我想我确实以一种有用的方式使用了泛型类型,这里的任何建议都将不胜感激 我最想要的答案是从两个代码段的末尾删除重复的IHashTable定义,并将其移动到自己的文件中,我似乎无法做到这一点。我甚至不确定这是否是一个接口放在首位。据我所知,它是这样编译和工作的 集合类型不完整,目前仅定义基本的most函数。一旦我确定我使用的语言及其功能正确,其他功能就不会太难了 这是我的哈

我想我需要一些关于我的收集类的反馈——仍在学习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;
}