blobt
4 years ago
5 changed files with 257 additions and 0 deletions
@ -0,0 +1,94 @@ |
|||||
|
export class Dictionary<T> { |
||||
|
|
||||
|
public constructor ( useES6Map: boolean = true ) { |
||||
|
if ( useES6Map === true ) { |
||||
|
this._items = new Map<string, T>(); |
||||
|
} else { |
||||
|
this._items = {}; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
public get length (): number { |
||||
|
return this._count; |
||||
|
} |
||||
|
|
||||
|
public contains ( key: string ): boolean { |
||||
|
if ( this._items instanceof Map ) { |
||||
|
return this._items.has( key ); |
||||
|
} else { |
||||
|
return ( this._items[ key ] !== undefined ); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
public find ( key: string ): T | undefined { |
||||
|
if ( this._items instanceof Map ) { |
||||
|
return this._items.get( key ); |
||||
|
} else { |
||||
|
return this._items[ key ]; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
public insert ( key: string, value: T ): void { |
||||
|
if ( this._items instanceof Map ) { |
||||
|
this._items.set( key, value ); |
||||
|
} |
||||
|
else { |
||||
|
this._items[ key ] = value; |
||||
|
} |
||||
|
this._count++; |
||||
|
} |
||||
|
|
||||
|
public remove ( key: string ): boolean { |
||||
|
let ret: T | undefined = this.find( key ); |
||||
|
if ( ret === undefined ) { |
||||
|
return false; |
||||
|
} |
||||
|
if ( this._items instanceof Map ) { |
||||
|
this._items.delete( key ); |
||||
|
} else { |
||||
|
delete this._items[ key ]; |
||||
|
} |
||||
|
this._count--; |
||||
|
return true; |
||||
|
} |
||||
|
|
||||
|
public get keys (): string[] { |
||||
|
let keys: string[] = []; |
||||
|
if ( this._items instanceof Map ) { |
||||
|
let keyArray = this._items.keys(); |
||||
|
for ( let key of keyArray ) { |
||||
|
keys.push( key ); |
||||
|
} |
||||
|
} else { |
||||
|
for ( var prop in this._items ) { |
||||
|
if ( this._items.hasOwnProperty( prop ) ) { |
||||
|
keys.push( prop ); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
return keys; |
||||
|
} |
||||
|
|
||||
|
public get values (): T[] { |
||||
|
let values: T[] = []; |
||||
|
if ( this._items instanceof Map ) { |
||||
|
// 一定要用of,否则出错
|
||||
|
let vArray = this._items.values(); |
||||
|
for ( let value of vArray ) { |
||||
|
values.push( value ) |
||||
|
} |
||||
|
} else { |
||||
|
for ( let prop in this._items ) { |
||||
|
if ( this._items.hasOwnProperty( prop ) ) { |
||||
|
values.push( this._items[ prop ] ); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
return values; |
||||
|
} |
||||
|
|
||||
|
private _items: ( { [ k: string ]: T } ) | Map<string, T>; |
||||
|
private _count: number = 0; |
||||
|
|
||||
|
} |
||||
|
|
@ -0,0 +1,10 @@ |
|||||
|
export class ListNode<T>{ |
||||
|
public next: ListNode<T> | null; |
||||
|
public prev: ListNode<T> | null; |
||||
|
public data: T | undefined; |
||||
|
|
||||
|
public constructor(data: T | undefined = undefined){ |
||||
|
this.next = this.prev = null; |
||||
|
this.data = data; |
||||
|
} |
||||
|
} |
@ -0,0 +1,72 @@ |
|||||
|
export class TypedArrayList<T extends Uint16Array | Float32Array | Uint8Array>{ |
||||
|
private _array: T; |
||||
|
private _typedArrayConstructor: (new (length: number) => T); |
||||
|
private _length: number; |
||||
|
private _capacity: number; |
||||
|
public capacityChangedCallback: ((arrayList: TypedArrayList<T>) => void) | null = null; |
||||
|
|
||||
|
public constructor(typedArrayConstructor: new (capacity: number) => T, capacity: number = 8) { |
||||
|
this._typedArrayConstructor = typedArrayConstructor; |
||||
|
this._capacity = capacity; |
||||
|
if (this._capacity == 0) { |
||||
|
this._capacity = 8; |
||||
|
} |
||||
|
this._array = new this._typedArrayConstructor(this._capacity); |
||||
|
this._length = 0; |
||||
|
} |
||||
|
|
||||
|
public push(num: number): number { |
||||
|
//判断是否需要扩容
|
||||
|
if (this._length > this._capacity) { |
||||
|
if (this._capacity > 0) { |
||||
|
this._capacity += this._capacity; |
||||
|
console.log("curr capaticy = " + this._capacity); |
||||
|
} |
||||
|
let oldArray: T = this._array; |
||||
|
this._array = new this._typedArrayConstructor(this._capacity); |
||||
|
|
||||
|
//设置老数据到新空间头部
|
||||
|
this._array.set(oldArray); |
||||
|
|
||||
|
//触发回调
|
||||
|
if (this.capacityChangedCallback !== null) { |
||||
|
this.capacityChangedCallback(this); |
||||
|
} |
||||
|
} |
||||
|
//插入数据
|
||||
|
this._array[this._length++] = num; |
||||
|
return this._length; |
||||
|
} |
||||
|
|
||||
|
public subArray(start: number = 0, end: number = this.length): T { |
||||
|
return this._array.subarray(start, end) as T; |
||||
|
} |
||||
|
|
||||
|
public slice(start: number = 0, end: number = this.length): T { |
||||
|
return this._array.slice(start, end) as T; |
||||
|
} |
||||
|
|
||||
|
public get length(): number { |
||||
|
return this._length; |
||||
|
} |
||||
|
|
||||
|
public get capacity(): number { |
||||
|
return this._capacity; |
||||
|
} |
||||
|
|
||||
|
public get typeArray(): T { |
||||
|
return this._array; |
||||
|
} |
||||
|
|
||||
|
public clear(): void { |
||||
|
this._length = 0; |
||||
|
} |
||||
|
|
||||
|
public at(idx: number): number { |
||||
|
if (idx < 0 || idx > this.length) { |
||||
|
throw new Error("索引越界!"); |
||||
|
} |
||||
|
let ret: number = this._array[idx]; |
||||
|
return ret; |
||||
|
} |
||||
|
}; |
@ -0,0 +1,10 @@ |
|||||
|
import { Dictionary } from "./Dictionary"; |
||||
|
|
||||
|
let dict: Dictionary<string> = new Dictionary(false); |
||||
|
dict.insert("ka", "a"); |
||||
|
dict.insert("kd", "d"); |
||||
|
dict.insert("kc", "c"); |
||||
|
dict.insert("kb", "b"); |
||||
|
|
||||
|
console.log(JSON.stringify(dict.keys)); |
||||
|
console.log(JSON.stringify(dict.values)); |
@ -0,0 +1,71 @@ |
|||||
|
{ |
||||
|
//"include": ["./demo.ts"], |
||||
|
"compilerOptions": { |
||||
|
/* Visit https://aka.ms/tsconfig.json to read more about this file */ |
||||
|
|
||||
|
/* Basic Options */ |
||||
|
// "incremental": true, /* Enable incremental compilation */ |
||||
|
"target": "ES2015", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', or 'ESNEXT'. */ |
||||
|
"module": "commonjs", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */ |
||||
|
// "lib": [], /* Specify library files to be included in the compilation. */ |
||||
|
// "allowJs": true, /* Allow javascript files to be compiled. */ |
||||
|
// "checkJs": true, /* Report errors in .js files. */ |
||||
|
// "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */ |
||||
|
// "declaration": true, /* Generates corresponding '.d.ts' file. */ |
||||
|
// "declarationMap": true, /* Generates a sourcemap for each corresponding '.d.ts' file. */ |
||||
|
// "sourceMap": true, /* Generates corresponding '.map' file. */ |
||||
|
// "outFile": "./", /* Concatenate and emit output to single file. */ |
||||
|
// "outDir": "./", /* Redirect output structure to the directory. */ |
||||
|
// "rootDir": "./", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */ |
||||
|
// "composite": true, /* Enable project compilation */ |
||||
|
// "tsBuildInfoFile": "./", /* Specify file to store incremental compilation information */ |
||||
|
"removeComments": true, /* Do not emit comments to output. */ |
||||
|
// "noEmit": true, /* Do not emit outputs. */ |
||||
|
// "importHelpers": true, /* Import emit helpers from 'tslib'. */ |
||||
|
// "downlevelIteration": true, /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */ |
||||
|
// "isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */ |
||||
|
|
||||
|
/* Strict Type-Checking Options */ |
||||
|
"strict": true, /* Enable all strict type-checking options. */ |
||||
|
// "noImplicitAny": true, /* Raise error on expressions and declarations with an implied 'any' type. */ |
||||
|
// "strictNullChecks": true, /* Enable strict null checks. */ |
||||
|
// "strictFunctionTypes": true, /* Enable strict checking of function types. */ |
||||
|
// "strictBindCallApply": true, /* Enable strict 'bind', 'call', and 'apply' methods on functions. */ |
||||
|
// "strictPropertyInitialization": true, /* Enable strict checking of property initialization in classes. */ |
||||
|
// "noImplicitThis": true, /* Raise error on 'this' expressions with an implied 'any' type. */ |
||||
|
// "alwaysStrict": true, /* Parse in strict mode and emit "use strict" for each source file. */ |
||||
|
|
||||
|
/* Additional Checks */ |
||||
|
// "noUnusedLocals": true, /* Report errors on unused locals. */ |
||||
|
// "noUnusedParameters": true, /* Report errors on unused parameters. */ |
||||
|
// "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */ |
||||
|
// "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */ |
||||
|
// "noUncheckedIndexedAccess": true, /* Include 'undefined' in index signature results */ |
||||
|
|
||||
|
/* Module Resolution Options */ |
||||
|
// "moduleResolution": "node", /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */ |
||||
|
// "baseUrl": "./", /* Base directory to resolve non-absolute module names. */ |
||||
|
// "paths": {}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */ |
||||
|
// "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */ |
||||
|
// "typeRoots": [], /* List of folders to include type definitions from. */ |
||||
|
// "types": [], /* Type declaration files to be included in compilation. */ |
||||
|
// "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */ |
||||
|
"esModuleInterop": true, /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */ |
||||
|
// "preserveSymlinks": true, /* Do not resolve the real path of symlinks. */ |
||||
|
// "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ |
||||
|
|
||||
|
/* Source Map Options */ |
||||
|
// "sourceRoot": "", /* Specify the location where debugger should locate TypeScript files instead of source locations. */ |
||||
|
// "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ |
||||
|
// "inlineSourceMap": true, /* Emit a single file with source maps instead of having a separate file. */ |
||||
|
// "inlineSources": true, /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */ |
||||
|
|
||||
|
/* Experimental Options */ |
||||
|
// "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */ |
||||
|
// "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */ |
||||
|
|
||||
|
/* Advanced Options */ |
||||
|
"skipLibCheck": true, /* Skip type checking of declaration files. */ |
||||
|
"forceConsistentCasingInFileNames": true /* Disallow inconsistently-cased references to the same file. */ |
||||
|
} |
||||
|
} |
Write
Preview
Loading…
Cancel
Save
Reference in new issue