Libraryless. Click here for Pure Java version (4771L/27K).
1 | // A version of ContentsIndexedList specialized for tokens |
2 | |
3 | // optimized for search - O(1) for searching for a token |
4 | // set is O(log m) with m = number of occurrences of token |
5 | final sclass TokenIndexedList3 extends RandomAccessAbstractList<S> implements IContentsIndexedList<S>, IContentsIndexedList2<S> {
|
6 | final new HashMap<S, TreeSet<Token>> index; // tokens by contents, sorted by index |
7 | final new ArrayList<Token> list; |
8 | |
9 | final sclass Token extends HasIndex {
|
10 | S s; // actual token |
11 | |
12 | toString { ret "Token " + quote(s) + "@" + idx; }
|
13 | } |
14 | |
15 | *() {}
|
16 | *(Collection<S> l) { addAll(l); }
|
17 | |
18 | public S get(int i) { ret list.get(i).s; }
|
19 | public int size() { ret list.size(); }
|
20 | |
21 | public S set(int i, S s) {
|
22 | Token t = list.get(i); |
23 | S old = t.s; |
24 | if (eq(old, s)) ret old; |
25 | removeFromIdx(t); |
26 | t.s = s; |
27 | addToIdx(t); |
28 | ret old; |
29 | } |
30 | |
31 | public bool add(S s) {
|
32 | ++modCount; |
33 | new Token t; |
34 | t.s = s; |
35 | t.idx = size(); |
36 | list.add(t); |
37 | addToIdx(t); |
38 | true; |
39 | } |
40 | |
41 | public void add(int i, S s) {
|
42 | ++modCount; |
43 | new Token t; |
44 | t.s = s; |
45 | t.idx = i; |
46 | list.add(i, t); |
47 | reorder(i+1); |
48 | addToIdx(t); |
49 | } |
50 | |
51 | public bool addAll(int i, Collection<? extends S> l) {
|
52 | int n = l.size(); |
53 | if (n == 0) false; |
54 | ++modCount; |
55 | L<Token> l2 = emptyList(n); |
56 | int j = i; |
57 | for (S s : l) {
|
58 | new Token t; |
59 | t.s = s; |
60 | t.idx = j++; |
61 | l2.add(t); |
62 | } |
63 | list.addAll(i, l2); |
64 | reorder(i+n); |
65 | for (Token t : l2) |
66 | addToIdx(t); |
67 | true; |
68 | } |
69 | |
70 | public S remove(int i) {
|
71 | ++modCount; |
72 | Token t = list.get(i); |
73 | removeFromIdx(t); |
74 | list.remove(i); |
75 | reorder(i); |
76 | ret t.s; |
77 | } |
78 | |
79 | void reorder(int fromIdx) {
|
80 | int n = size(); |
81 | for (int i = fromIdx; i < n; i++) |
82 | list.get(i).idx = i; |
83 | } |
84 | |
85 | void removeFromIdx(Token t) {
|
86 | TreeSet<Token> idx = index.get(t.s); |
87 | idx.remove(t); |
88 | if (idx.isEmpty()) index.remove(t.s); |
89 | } |
90 | |
91 | void addToIdx(Token t) {
|
92 | TreeSet<Token> idx = index.get(t.s); |
93 | if (idx == null) |
94 | index.put(t.s, idx = new TreeSet); |
95 | idx.add(t); |
96 | } |
97 | |
98 | @Override |
99 | public int indexOf(O s) {
|
100 | TreeSet<Token> l = index.get(s); |
101 | ret l == null ? -1 : first(l).idx; |
102 | } |
103 | |
104 | @Override |
105 | public int lastIndexOf(O s) {
|
106 | TreeSet<Token> l = index.get(s); |
107 | ret l == null ? -1 : last(l).idx; |
108 | } |
109 | |
110 | @Override |
111 | public bool contains(O s) {
|
112 | ret index.containsKey(s); |
113 | } |
114 | |
115 | public void clear() {
|
116 | ++modCount; |
117 | index.clear(); |
118 | list.clear(); |
119 | } |
120 | |
121 | protected void removeRange(int fromIndex, int toIndex) {
|
122 | if (fromIndex == toIndex) ret; |
123 | ++modCount; |
124 | |
125 | for (int i = fromIndex; i < toIndex; i++) |
126 | removeFromIdx(list.get(i)); |
127 | |
128 | list.subList(fromIndex, toIndex).clear(); |
129 | reorder(fromIndex); |
130 | } |
131 | |
132 | public int[] indicesOf(S o) {
|
133 | TreeSet<Token> idx = index.get(o); |
134 | if (idx == null) ret emptyIntArray(); |
135 | int[] a = new int[idx.size()]; |
136 | int i = 0; |
137 | for (Token t : idx) a[i++] = t.idx; |
138 | ret a; |
139 | } |
140 | |
141 | public TreeSet<HasIndex> indicesOf_treeSetOfHasIndex(S o) {
|
142 | ret (TreeSet) index.get(o); |
143 | } |
144 | } |
Began life as a copy of #1025481
download show line numbers debug dex old transpilations
Travelled to 7 computer(s): bhatertpkbcr, mqqgnosmbjvj, onxytkatvevr, pyentgdyhuwx, pzhvpgtvlbxg, tvejysmllsmz, vouqrxazstgt
No comments. add comment
| Snippet ID: | #1025510 |
| Snippet name: | TokenIndexedList3 [using treeset in index, OK] |
| Eternal ID of this version: | #1025510/25 |
| Text MD5: | 25446ecdadde5cdaa0d7501f3d252420 |
| Transpilation MD5: | 011d6894c23c0092f0e7b773a773b73f |
| Author: | stefan |
| Category: | javax / image analysis |
| Type: | JavaX fragment (include) |
| Public (visible to everyone): | Yes |
| Archived (hidden from active list): | No |
| Created/modified: | 2022-01-15 01:45:09 |
| Source code size: | 3246 bytes / 144 lines |
| Pitched / IR pitched: | No / No |
| Views / Downloads: | 607 / 1180 |
| Version history: | 24 change(s) |
| Referenced in: | [show references] |