AxeSlide软件项目梳理   canvas绘图系列知识点整理

以下代码是typescript语言来写的,其实和es6面向对象的写法基本一致。大家阅读后都明白这些方法的作用。

hash

hash结构用于处理和表现类似key/value的键值对,其中key通常可用来快速查找,同时key是区分大小写;value用于存储对应于key的值。

实现该数据结构的几个方法:

函数名 说明 返回值
set(key,value) 添加项
del(key) 根据key删除一项
has(key) 是否包含某个key bool
get(key) 根据key值获取value value
first() 获取第一个value value
last() 获取最后一个value value
count() 获取项总数 int
all() 返回所有值的数组 array
getByIndex(index) 根据在数组中的index顺序获取value value
foreach(callback) 遍历所有值
indexOf(key) 根据key值获取在数组中的顺序值 index,int
insertAt(index,value,key) 在指定index位置插入key,value
   export class HashTable<T> {
private items: { [key: string]: HashValue<T> };
@SerializeProperty({ list: true, type: Array })
private itemList: Array<T>;
constructor() {
super();
this.items = {};
this.itemList = [];
} set(key: string, value: T): void {
var vl = new HashValue<T>();
vl.key = key;
vl.value = value;
var index = this.itemList.length;
if (this.has(key)) {
index = this.items[key].index;
}
vl.index = index;
this.itemList[index] = value;
this.items[key] = vl;
} del(key: string): void {
if (this.has(key)) {
var index = this.items[key].index;
if (index > -1) {
this.itemList.splice(index, 1);
}
delete this.items[key];
this.resetIndex();
}
} resetIndex(): void { this.foreach((k, v: T) => {
var index = this.itemList.indexOf(v);
this.items[k].index = index;
});
} has(key: string): boolean {
return key in this.items;
} get(key: string): T {
if (this.has(key)) {
return this.items[key].value;
}
return null;
} count(): number {
return this.itemList.length;
} all(): Array<T> {
return this.itemList;
} first() {
return this.itemList[0];
} last() {
return this.itemList[this.itemList.length - 1];
} getByIndex(index: number): T {
return this.itemList[index];
} //遍历 扩展
foreach(callback) {
for (var key in this.items) {
callback(key, this.items[key].value);
}
} //获取index
indexOf(key) {
if (this.has(key)) {
return this.items[key].index;
}
} //插入
insertAt(index: number, value: T, key: string) {
this.itemList.splice(index, 0, value);
var hashV = new HashValue<T>();
hashV.index = index;
hashV.key = key;
hashV.value = value;
this.items[key] = hashV;
this.resetIndex();
} sort(callback: Function) {
this.itemList.sort((a: T, b: T) => { return callback(a, b);
});
}
}

List

js实现链表List数据结构的几个方法:

函数名 说明 返回值
add(value) 添加项
addList(list) 添加另一个集合
pop() 删除最后一项 并返回该项 value
shift() 删除第一项 并返回该项 value
remove(index) 根据索引值删除某一项
removeMany(index,count) 删除从指定位置开始的某几项
clear() 删除所有项
contains(value) 是否包含某个值 boolean
indexOf(value) 根据值获取在数组中的顺序值 int
get(index) 根据index获取value value
set(index,value) 设置index位置的value
length() 获取项总数 int
all() 返回所有值的数组 array
foreach(callback) 遍历所有值
reverseForeach(callback) 倒序遍历所有值
sort(callback) 根据某个排序规则进行排序
insert(index,value) 在指定index位置插入value

  export class List<T> {
private items: Array<T>; private checkIndex(index): boolean {
return !(index < 0 || isNaN(index) || index >= this.items.length);
}
constructor() {
super();
this.items = new Array<T>();
} length(): number {
return this.items.length;
} add(value: T): void {
this.items.push(value);
}
addList(valueList: List<T>) {
for (var i = 0; i < valueList.length(); i++) { var value = valueList.get(i);
this.items.push(value);
}
}
pop(): T {
return this.items.pop();
} shift() {
this.items.shift();
} remove(index: number): void {
if (this.checkIndex(index)) {
this.items.splice(index,1); }
}
/**
* 從指定索引處開始刪除指定個數的元素
* @param from
* @param count
*/
removeMany(from: number, count: number) { if (this.checkIndex(from)) {
this.items.splice(from, count);
}
} clear(): void {
this.items = [];
} contains(value: T): boolean {
for (var i in this.items) {
return value == this.items[i];
}
return false;
} indexOf(value: T): number {
return this.items.indexOf(value);
} insert(index: number, value: T) {
//this.checkIndex(index) && this.items.splice(index , 0, value);
this.items.splice(index, 0, value);
} get(index: number): T {
return this.items[index];
}
set(index, value: T) {
this.items[index] = value;
}
all(): Array<T> {
return this.items;
}
foreach(callback:(i:number,item:T)=>any) {
var len = this.items.length;
for (var i = 0; i < len; i++) {
if (callback(i, this.items[i]) === false) break;
}
}
reverseForeach(callback) {
var len = this.items.length;
for (var i = len - 1; i >= 0; i--) {
if (callback(i, this.items[i]) === false) break;
}
}
sort(callback: Function) {
this.items.sort((a: T, b: T) => { return callback(a, b); });
}
}

js实现存储对象的数据结构hashTable和list的更多相关文章

  1. js实现哈希表(HashTable)

    在算法中,尤其是有关数组的算法中,哈希表的使用可以很好的解决问题,所以这篇文章会记录一些有关js实现哈希表并给出解决实际问题的例子. 第一部分:相关知识点 属性的枚举: var person = { ...

  2. JS基础学习——对象

    JS基础学习--对象 什么是对象 对象object是JS的一种基本数据类型,除此之外还包括的基本数据类型有string.number.boolean.null.undefined.与其他数据类型不同的 ...

  3. javascript中的内置对象和数据结构

    目录 简介 基础类型 undefined Boolean和Boolean对象 Number和BigInt String Symbol null Object Function Date Array K ...

  4. js object(对象)

    http://www.cnblogs.com/pingchuanxin/p/5773326.html Object(对象)是在所有的编程语言中都十分重要的一个概念,对于事物我们可以把他们看作是一个对象 ...

  5. Node.js:全局对象

    概要:本篇博客主要介绍了node.js中的全局对象. 在JavaScript中,通常window是全局对象,而node.js中的全局对象是global,所有全局变量(除了global本身之外)都是gl ...

  6. 4月5日--课堂笔记--JS内置对象

    JavaScript 4.5 一.    JS内置对象 1.数组Array a)创建语法1:var arr=new Array(参数); i.       没有参数:创建一个初始容量为0的数组 ii. ...

  7. js Web存储方式

    JSON是数据交互中最常用的一种数据格式. 由于各种语言的语法都不同,在传递数据时,可以将自己语言中的数组.对象等转换为JSON字符串> 传递之后,可以讲JSON字符串,在解析为JSON对象. ...

  8. JAVA之旅(二十)—HashSet,自定义存储对象,TreeSet,二叉树,实现Comparator方式排序,TreeSet小练习

    JAVA之旅(二十)-HashSet,自定义存储对象,TreeSet,二叉树,实现Comparator方式排序,TreeSet小练习 我们继续说一下集合框架 Set:元素是无序(存入和取出的顺序不一定 ...

  9. JS内置对象-String对象、Date日期对象、Array数组对象、Math对象

    一.JavaScript中的所有事物都是对象:字符串.数组.数值.函数... 1.每个对象带有属性和方法 JavaScript允许自定义对象 2.自定义对象 a.定义并创建对象实例 b.使用函数来定义 ...

随机推荐

  1. Spring+SpringMVC+MyBatis深入学习及搭建(五)——动态sql

    转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/6908763.html 前面有讲到Spring+SpringMVC+MyBatis深入学习及搭建(四)——My ...

  2. python 多线程,进程的理解

    python的threading.Thread类有一个run方法,用于定义线程的功能函数,可以在自己的线程类中覆盖该方法.而创建自己的线程实例后,通过Thread类的start方法,可以启动该线程,交 ...

  3. YII缓存依赖的应用

    YII缓存依赖的应用 缓存 缓存依赖 Yii 缓存是提升Web应用性能的简便有效的方式.当我们在加载网页需要过多的时间,比如说查询时间过久,抑或是调用接口占用过多I/O,建立缓存是一个行之有效的方法, ...

  4. SQL Server 中函数的理解总结

    T-SQL语言为我们提供了更加灵活的方式操作数据,那就是函数,函数总的分为三大类:标量函数:(传入一个参数,再传出一个参数)聚合函数(传入多个参数,传出一个参数),表值函数(传入一个结果集对象,让我们 ...

  5. xtrabackup原理、备份日志分析、备份信息获取

    一. xtrabackup备份恢复工作原理: extrabackup备份简要步骤 InnoDB引擎很大程度上与Oracle类似,使用redo,undo机制,XtraBackup在备份的时候,以read ...

  6. ZooKeeper分布式锁浅谈(一)

    一.概述 清明节的时候写了一篇分布式锁概述,里面介绍了分布式锁实现的几种方式,其实那时候我一直沉迷于使用redis的悲观锁和乐观锁来实现分布式锁,直到一个血案的引发才让我重新认识了redis分布式锁的 ...

  7. Maximum Subarray Sum

    Maximum Subarray Sum 题意 给你一个大小为N的数组和另外一个整数M.你的目标是找到每个子数组的和对M取余数的最大值.子数组是指原数组的任意连续元素的子集. 分析 参考 求出前缀和, ...

  8. ZooKeeper源码分析-Jute-第一部分

    Hadoop record I/O 包含class文件以及record描述语言解释器用于简化records的序列化和反序列化. 介绍 任何显著复杂性的软件系统都需要与外界进行数据交换的机制.数据交互通 ...

  9. php 可变函数

    //可变函数    function Test(){        $arr = func_get_args();       //获取所有参数 ,返回数组    $sum=0;     for($i ...

  10. XML配置文件中写版本号.xsd和不写版本号的区别

    如果写版本号则默认从网上下载并指定最新版本,如果不写版本号则默认从本地下载并使用最新版本.