ts-list
Version:
Typescript implementation for List with ArrayList
195 lines (151 loc) • 4.54 kB
text/typescript
export interface Equality<T> {
equals(other: T): boolean;
}
export interface Comparable<T> extends Equality<T> {
compare(other: T): number;
}
export interface Serializable {
serialize(): string;
deserialize(content: string): void;
}
export enum ORDER {
ASC, DESC
}
export interface List<T extends Comparable<T>> extends Serializable {
add(item: T): boolean;
addAll(items: List<T>): void;
remove(item: T): boolean;
removeIndex(index: number): boolean;
size(): number;
isEmpty(): boolean;
contains(item: T): boolean;
indexOf(item: T): number;
set(index: number, item: T): T;
get(index: number): T;
swap(p: number, q: number): void;
sublist(start: number, end: number): List<T>;
order(way?: ORDER): List<T>;
toArray(): T[];
clear(): void;
pagination(pagenumber: number, itemsPerPage: number): List<T>;
serialize(): any;
deserialize(content: any): void;
forEach(callbackfn: (value: T, index: number, array: T[]) => void, thisArg?: any): void;
}
export class ArrayList<T extends Comparable<T>> implements List<T>{
private array: T[] = [];
constructor() {
}
toArray(): T[] {
return this.array;
}
addAll(items: List<T>): void {
if (items == null) {
return;
}
for (let i = 0; i < items.size(); i++) {
this.add(items.get(i));
}
}
clear() {
this.array = [];
}
order(way?: ORDER): List<T> {
let direction: number = 1;
if (way == ORDER.DESC) {
direction = -1;
}
for (let i = 1; i < this.size(); i++) {
for (let j = i; j > 0 && (this.get(j - 1).compare(this.get(j)) * direction) > 0; --j) {
this.swap(j - 1, j);
}
}
return this;
}
forEach(callbackfn: (value: T, index: number, array: T[]) => void, thisArg?: any): void {
this.array.forEach(callbackfn);
}
swap(p: number, q: number): void {
if (p >= 0 && q >= 0) {
let tmp: T = this.get(p);
this.set(p, this.get(q));
this.set(q, tmp);
}
}
remove(item: T): boolean {
let index: number = this.indexOf(item);
if (index >= 0) {
this.removeIndex(index);
return true;
}
return false;
}
removeIndex(index: number): boolean {
if (index >= 0 && index < this.size()) {
this.array.splice(index, 1);
return true;
}
return false;
}
size(): number {
return this.array.length;
}
isEmpty(): boolean {
return this.size() == 0;
}
contains(item: T): boolean {
let index = this.indexOf(item);
if (index >= 0) {
return true;
}
return false;
}
indexOf(item: T): number {
for (let i = 0; i < this.size(); i++) {
let it: T = this.get(i);
if (item.equals(it)) {
return i;
}
}
return -1;
}
set(index: number, item: T): T {
if (index >= 0 && index < this.size()) {
let old: T = this.get(index);
this.array[index] = item;
return old;
}
return null;
}
get(index: number): T {
if (index >= 0 && index < this.size()) {
return this.array[index];
}
return null;
}
sublist(start: number, end: number): List<T> {
let sublist: ArrayList<T> = new ArrayList<T>();
if (start >= 0 && end >= 0) {
for (let i = Math.max(0, start); i <= Math.min(end, this.size() - 1); i++) {
sublist.add(this.get(i));
}
}
return sublist;
}
pagination(pagenumber: number, itemsPerPage: number): List<T> {
let start: number = itemsPerPage * (pagenumber - 1);
return this.sublist(start, start + (itemsPerPage - 1));
}
add(item: T): boolean {
this.array.push(item);
return true;
}
serialize(): string {
return JSON.stringify(this.array);
}
deserialize(content: string): void {
if (content != null && content.length > 0) {
this.array = JSON.parse(content);
}
}
}