TypeScript中的HashSet和Dictionary:Interface的导出

时间:2017-07-25 21:05:13

标签: dictionary typescript collections hashset

我想我需要一些关于我的集合类的反馈 - 仍然学习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,然后将此数字分配给每个实例。这样可以保证唯一性......还有更好的东西吗?

感谢您的提示! 拉尔夫

0 个答案:

没有答案