Skip to content

Commit 279f335

Browse files
committed
✨ ArrayList追加
1 parent 3634575 commit 279f335

14 files changed

+598
-90
lines changed

dist/JavaLibraryScript.js

Lines changed: 250 additions & 39 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/JavaLibraryScript.js.map

Lines changed: 13 additions & 9 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/JavaLibraryScript.min.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/JavaLibraryScript.min.js.map

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "javalibraryscript",
3-
"version": "v1.0.4.6",
3+
"version": "v1.0.5.1",
44
"description": "Javaの機能をJavaScriptに適当に再現",
55
"main": "index.js",
66
"scripts": {

src/util/ArrayList.js

Lines changed: 148 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,148 @@
1+
const ListInterface = require("./ListInterface.js");
2+
const TypeChecker = require("../libs/TypeChecker.js");
3+
const StreamChecker = require("./stream/StreamChecker.js");
4+
const Stream = require("./stream/Stream.js");
5+
6+
/**
7+
* 型チェック機能のついたList
8+
* @template V
9+
* @extends {ListInterface<V>}
10+
* @class
11+
*/
12+
class ArrayList extends ListInterface {
13+
/**
14+
* @param {Function} ValueType
15+
*/
16+
constructor(ValueType) {
17+
super(ValueType);
18+
this._list = [];
19+
}
20+
21+
// ==================================================
22+
// 基本操作
23+
// ==================================================
24+
25+
/**
26+
* 要素を追加する
27+
* @param {V} item
28+
* @returns {this}
29+
* @throws {TypeError}
30+
*/
31+
add(item) {
32+
this._checkValue(item);
33+
this._list.push(item);
34+
return this;
35+
}
36+
37+
/**
38+
* 指定したインデックスの要素を取得する
39+
* @param {Number} index
40+
* @returns {V}
41+
*/
42+
get(index) {
43+
return this._list[index];
44+
}
45+
46+
/**
47+
* 指定したインデックスの要素を設定する
48+
* @param {Number} index
49+
* @param {V} item
50+
* @returns {this}
51+
* @throws {TypeError}
52+
*/
53+
set(index, item) {
54+
this._checkValue(item);
55+
this._list[index] = item;
56+
return this;
57+
}
58+
59+
/**
60+
* 指定したインデックスの要素を削除する
61+
* @param {Number} index
62+
* @returns {V}
63+
*/
64+
remove(index) {
65+
return this._list.splice(index, 1)[0];
66+
}
67+
68+
/**
69+
* 要素数を返却する
70+
* @returns {Number}
71+
* @readonly
72+
*/
73+
get size() {
74+
return this._list.length;
75+
}
76+
77+
/**
78+
* 全要素を削除する
79+
*/
80+
clear() {
81+
this._list.length = 0;
82+
}
83+
84+
// ==================================================
85+
// 追加機能
86+
// ==================================================
87+
88+
/**
89+
* EnumのIteratorを返却する
90+
* @returns {ArrayIterator<V>}
91+
*/
92+
values() {
93+
return this._list.values();
94+
}
95+
96+
/**
97+
* 全てのデータを呼び出す
98+
* @param {Function} callback
99+
* @param {any} [thisArg]
100+
*/
101+
forEach(callback, thisArg) {
102+
for (const item of this._list) {
103+
callback.call(thisArg, item, item, this._list);
104+
}
105+
}
106+
107+
// ==================================================
108+
// Stream
109+
// ==================================================
110+
111+
/**
112+
* Streamを返却する
113+
* @returns {Stream<V>}
114+
*/
115+
stream() {
116+
return StreamChecker.typeToStream(this._ValueType).from(this._list, this._ValueType);
117+
}
118+
119+
// ==================================================
120+
// 基本操作(システム)
121+
// ==================================================
122+
123+
/**
124+
* 配列に変換する
125+
* @returns {V[]}
126+
*/
127+
toArray() {
128+
return this._list.slice();
129+
}
130+
131+
/**
132+
* 文字列に変換する
133+
* @returns {string}
134+
*/
135+
toString() {
136+
return `${this.constructor.name}<${TypeChecker.typeNames(this._ValueType)}>(size=${this.size})`;
137+
}
138+
139+
/**
140+
* イテレータを返却する
141+
* @returns {Iterator<V>}
142+
*/
143+
[Symbol.iterator]() {
144+
return this.values();
145+
}
146+
}
147+
148+
module.exports = ArrayList;

src/util/HashMap.js

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -134,14 +134,6 @@ class HashMap extends MapInterface {
134134
return this.entries();
135135
}
136136

137-
/**
138-
* 空かどうかを返却する
139-
* @returns {boolean}
140-
*/
141-
isEmpty() {
142-
return super.size === 0;
143-
}
144-
145137
// ==================================================
146138
// 追加機能
147139
// ==================================================

src/util/HashSet.js

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ const StreamChecker = require("./stream/StreamChecker");
44
const Stream = require("./stream/Stream.js");
55

66
/**
7-
* 型チェック機能のついたMap
7+
* 型チェック機能のついたSet
88
* @template V
99
* @extends {SetInterface<V>}
1010
* @class
@@ -112,14 +112,6 @@ class HashSet extends SetInterface {
112112
return modified;
113113
}
114114

115-
/**
116-
* 空かどうかを返却する
117-
* @returns {boolean}
118-
*/
119-
isEmpty() {
120-
return this.size === 0;
121-
}
122-
123115
/**
124116
* 含まれない要素を全削除する
125117
* @param {Iterable<V>} collection

src/util/ListInterface.js

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
const JavaLibraryScriptCore = require("../libs/sys/JavaLibraryScriptCore.js");
2+
const Interface = require("../base/Interface");
3+
const TypeChecker = require("../libs/TypeChecker");
4+
5+
const Any = TypeChecker.Any;
6+
const NoReturn = TypeChecker.NoReturn;
7+
const NotNull = TypeChecker.NotNull;
8+
const NotUndefined = TypeChecker.NotUndefined;
9+
10+
const NotEmpty = [NotNull, NotUndefined];
11+
12+
/**
13+
* Listの基底クラス
14+
* @template V
15+
* @extends {JavaLibraryScriptCore}
16+
* @class
17+
* @abstract
18+
* @interface
19+
*/
20+
class ListInterface extends JavaLibraryScriptCore {
21+
/**
22+
* @param {Function} ValueType
23+
*/
24+
constructor(ValueType) {
25+
super();
26+
this._ValueType = ValueType || Any;
27+
}
28+
29+
/**
30+
* Valueの型をチェックする
31+
* @param {V} value
32+
* @throws {TypeError}
33+
*/
34+
_checkValue(value) {
35+
if (!TypeChecker.matchType(value, this._ValueType)) {
36+
throw new TypeError(`値型が一致しません。期待: ${TypeChecker.typeNames(this._ValueType)} → 実際: ${TypeChecker.stringify(value)}`);
37+
}
38+
}
39+
40+
/**
41+
* 空かどうかを返却する
42+
* @returns {boolean}
43+
*/
44+
isEmpty() {
45+
return this.size === 0;
46+
}
47+
}
48+
49+
module.exports = Interface.convert(ListInterface, {
50+
add: { args: [NotEmpty], returns: ListInterface },
51+
get: { args: [Number], returns: Any },
52+
set: { args: [Number, NotEmpty], returns: ListInterface },
53+
remove: { args: [Number], returns: Any },
54+
isEmpty: { returns: Boolean, abstract: true },
55+
clear: { returns: NoReturn },
56+
toArray: { returns: Array },
57+
});

src/util/MapInterface.js

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -48,15 +48,23 @@ class MapInterface extends Map {
4848
throw new TypeError(`値型が一致しません。期待: ${TypeChecker.typeNames(this._ValueType)} → 実際: ${TypeChecker.stringify(value)}`);
4949
}
5050
}
51+
52+
/**
53+
* 空かどうかを返却する
54+
* @returns {boolean}
55+
*/
56+
isEmpty() {
57+
return this.size === 0;
58+
}
5159
}
5260

5361
module.exports = Interface.convert(MapInterface, {
54-
set: { args: [NotEmpty, NotEmpty], returns: Any, abstract: true },
55-
put: { args: [NotEmpty, NotEmpty], returns: Any },
62+
set: { args: [NotEmpty, NotEmpty], returns: MapInterface, abstract: true },
63+
put: { args: [NotEmpty, NotEmpty], returns: MapInterface },
5664
get: { args: [NotEmpty], returns: Any, abstract: true },
5765
delete: { args: [NotEmpty], returns: Boolean, abstract: true },
5866
remove: { args: [NotEmpty], returns: Boolean },
59-
isEmpty: { returns: Boolean },
67+
isEmpty: { returns: Boolean, abstract: true },
6068
clear: { returns: NoReturn },
6169
has: { args: [NotEmpty], returns: Boolean, abstract: true },
6270
containsKey: { args: [NotEmpty], returns: Boolean },

0 commit comments

Comments
 (0)