aa
Ary.java
Go to the documentation of this file.
1 package com.cliffc.aa.util;
2 
3 import org.jetbrains.annotations.NotNull;
4 
5 import java.lang.reflect.Array;
6 import java.util.*;
7 import java.util.function.Function;
8 import java.util.function.Predicate;
9 
10 // ArrayList with saner syntax
11 public class Ary<E> implements Iterable<E> {
12  public E[] _es;
13  public int _len;
14  public Ary(E[] es) { this(es,es.length); }
15  public Ary(E[] es, int len) { if( es.length==0 ) es=Arrays.copyOf(es,1); _es=es; _len=len; }
16  @SuppressWarnings("unchecked")
17  public Ary(Class<E> clazz) { this((E[]) Array.newInstance(clazz, 1),0); }
18 
20  public boolean isEmpty() { return _len==0; }
22  public int len() { return _len; }
25  public E at( int i ) {
26  range_check(i);
27  return _es[i];
28  }
31  public E atX( int i ) {
32  return i < _len ? _es[i] : null;
33  }
35  public E last( ) {
36  range_check(0);
37  return _es[_len-1];
38  }
39 
41  public E pop( ) {
42  range_check(0);
43  return _es[--_len];
44  }
45 
49  public Ary<E> add( E e ) {
50  if( _len >= _es.length ) _es = Arrays.copyOf(_es,Math.max(1,_es.length<<1));
51  _es[_len++] = e;
52  return this;
53  }
54 
58  public E push( E e ) {
59  if( _len >= _es.length ) _es = Arrays.copyOf(_es,Math.max(1,_es.length<<1));
60  return (_es[_len++] = e);
61  }
62 
67  public void insert( int i, E e ) {
68  if( i < 0 || i>_len )
69  throw new ArrayIndexOutOfBoundsException(""+i+" >= "+_len);
70  if( _len >= _es.length ) _es = Arrays.copyOf(_es,Math.max(1,_es.length<<1));
71  System.arraycopy(_es,i,_es,i+1,(_len++)-i);
72  _es[i] = e;
73  }
74 
78  public E del( int i ) {
79  range_check(i);
80  E tmp = _es[i];
81  _es[i]=_es[--_len];
82  return tmp;
83  }
84 
88  public E del( E e ) {
89  for( int i=0; i<_len; i++ ) {
90  E tmp = _es[i];
91  if( tmp==e ) {
92  _es[i]=_es[--_len];
93  return tmp;
94  }
95  }
96  return null;
97  }
98 
102  public E remove( int i ) {
103  range_check(i);
104  E e = _es[i];
105  System.arraycopy(_es,i+1,_es,i,(--_len)-i);
106  return e;
107  }
108 
110  public void clear( ) { _len=0; }
111 
112  public void fill( E e ) { Arrays.fill(_es,0,_len,e); }
113 
114  // Extend and set
115  public E setX( int i, E e ) {
116  if( i >= _len ) Arrays.fill(_es,_len,_es.length,null);
117  while( i>= _es.length ) _es = Arrays.copyOf(_es,_es.length<<1);
118  if( i >= _len ) _len = i+1;
119  return (_es[i] = e);
120  }
121 
126  public void clear( int i ) { if( i<_len ) _es[i]=null; }
127 
133  public E set( int i, E e ) {
134  range_check(i);
135  E old = _es[i];
136  _es[i] = e;
137  return old;
138  }
139 
140  public Ary<E> set_len( int len ) {
141  if( len > _len )
142  while( len>= _es.length ) _es = Arrays.copyOf(_es,_es.length<<1);
143  _len = len;
144  while( _es.length > (len<<1) ) // Shrink if hugely too large
145  _es = Arrays.copyOf(_es,_es.length>>1);
146  Arrays.fill(_es,len,_es.length,null);
147  return this;
148  }
149 
151  public Ary<E> addAll( Collection<? extends E> c ) { if( c!=null ) for( E e : c ) add(e); return this; }
152 
154  public <F extends E> Ary<E> addAll( F[] es ) {
155  if( es==null || es.length==0 ) return this;
156  while( _len+es.length > _es.length ) _es = Arrays.copyOf(_es,_es.length<<1);
157  System.arraycopy(es,0,_es,_len,es.length);
158  _len += es.length;
159  return this;
160  }
161 
164  if( c==null || c._len==0 ) return this;
165  while( _len+c._len > _es.length ) _es = Arrays.copyOf(_es,_es.length<<1);
166  System.arraycopy(c._es,0,_es,_len,c._len);
167  _len += c._len;
168  return this;
169  }
170 
172  public E[] asAry() { return Arrays.copyOf(_es,_len); }
173 
175  public Ary<E> map_update( Function<E,E> f ) { for( int i = 0; i<_len; i++ ) _es[i] = f.apply(_es[i]); return this; }
179  public Ary<E> filter_update( Predicate<E> P ) {
180  for( int i=0; i<_len; i++ )
181  if( !P.test(_es[i]) )
182  del(i--);
183  return this;
184  }
187  public void sort_update(Comparator<? super E> c ) { Arrays.sort(_es, 0, _len, c); }
192  public int find( E e ) {
193  for( int i=0; i<_len; i++ ) if( _es[i]==e ) return i;
194  return -1;
195  }
200  public int find( Predicate<E> P ) {
201  for( int i=0; i<_len; i++ ) if( P.test(_es[i]) ) return i;
202  return -1;
203  }
208  public boolean replace( E old, E nnn ) {
209  for( int i=0; i<_len; i++ ) if( _es[i]==old ) { _es[i]=nnn; return true; }
210  return false;
211  }
212 
213 
222  public static <X extends Comparable<X>> Ary<X> merge_or( Ary<X> a0, Ary<X> a1 ) {
223  int i=0, j=0;
224  Ary<X> res = new Ary<>(Arrays.copyOf(a0._es,a0._len+a1._len),0);
225 
226  while( i<a0._len && j<a1._len ) {
227  X x = a0._es[i];
228  X y = a1._es[j];
229  int cmp = x.compareTo(y);
230  if( cmp<0 ) { res.add(x); i++; }
231  else if( cmp>0 ) { res.add(y); j++; }
232  else { res.add(x); i++; j++; }
233  }
234  while( i<a0._len ) res.add(a0._es[i++]);
235  while( j<a1._len ) res.add(a1._es[j++]);
236  return res;
237  }
238 
249  public static <X> Ary<X> merge_or( Ary<X> a0, Ary<X> a1, Comparator<X> cmpr, Predicate<X> filter) {
250  int i=0, j=0;
251  Ary<X> res = new Ary<>(Arrays.copyOf(a0._es,a0._len+a1._len),0);
252 
253  while( i<a0._len && j<a1._len ) {
254  X x = a0._es[i]; if( !filter.test(x) ) { i++; continue; }
255  X y = a1._es[j]; if( !filter.test(y) ) { j++; continue; }
256  int cmp = cmpr.compare(x,y);
257  if( cmp<0 ) { res.add(x); i++; }
258  else if( cmp>0 ) { res.add(y); j++; }
259  else { res.add(x); i++; j++; }
260  }
261  while( i<a0._len ) if( filter.test(a0._es[i++]) ) res.add(a0._es[i-1]);
262  while( j<a1._len ) if( filter.test(a1._es[j++]) ) res.add(a1._es[j-1]);
263  return res;
264  }
265 
266 
275  public static <X extends Comparable<X>> Ary<X> merge_and( Ary<X> a0, Ary<X> a1 ) {
276  int i=0, j=0;
277  Ary<X> res = new Ary<>(Arrays.copyOf(a0._es,Math.min(a0._len,a1._len)),0);
278  while( i<a0._len && j<a1._len ) {
279  X x = a0._es[i];
280  X y = a1._es[j];
281  int cmp = x.compareTo(y);
282  if( cmp<0 ) { i++; }
283  else if( cmp>0 ) { j++; }
284  else { res.add(x); i++; j++; }
285  }
286  return res;
287  }
288 
290  @NotNull
291  @Override public Iterator<E> iterator() { return new Iter(); }
292  private class Iter implements Iterator<E> {
293  int _i=0;
294  @Override public boolean hasNext() { return _i<_len; }
295  @Override public E next() { return _es[_i++]; }
296  }
297 
298  @Override public String toString() {
299  SB sb = new SB().p('{');
300  for( int i=0; i<_len; i++ ) {
301  if( i>0 ) sb.p(',');
302  if( _es[i] != null ) sb.p(_es[i].toString());
303  }
304  return sb.p('}').toString();
305  }
306 
307  private void range_check( int i ) {
308  if( i < 0 || i>=_len )
309  throw new ArrayIndexOutOfBoundsException(""+i+" >= "+_len);
310  }
311 
312  // Note that the hashCode() and equals() are not invariant to changes in the
313  // underlying array. If the hashCode() is used (e.g., inserting into a
314  // HashMap) and the then the array changes, the hashCode() will change also.
315  @Override public boolean equals( Object o ) {
316  if( this==o ) return true;
317  if( !(o instanceof Ary) ) return false;
318  Ary ary = (Ary)o;
319  if( _len != ary._len ) return false;
320  if( _es == ary._es ) return true;
321  for( int i=0; i<_len; i++ )
322  if( !(_es[i]==null ? (ary._es[i] == null) : _es[i].equals(ary._es[i])) )
323  return false;
324  return true;
325  }
326  @Override public int hashCode( ) {
327  int sum=_len;
328  for( int i=0; i<_len; i++ )
329  sum += _es[i]==null ? 0 : _es[i].hashCode();
330  return sum;
331  }
332 
333  public Ary<E> deepCopy() {
334  return new Ary<>(_es.clone(),_len);
335  }
336 }
com.cliffc.aa.util.Ary.at
E at(int i)
Definition: Ary.java:25
com.cliffc.aa.util.Ary.Iter.next
E next()
Definition: Ary.java:295
com.cliffc.aa.util.Ary.fill
void fill(E e)
Definition: Ary.java:112
com.cliffc.aa.util.Ary.push
E push(E e)
Add element in amortized constant time.
Definition: Ary.java:58
com.cliffc.aa.util.Ary.isEmpty
boolean isEmpty()
Definition: Ary.java:20
com.cliffc.aa.util.Ary.set_len
Ary< E > set_len(int len)
Definition: Ary.java:140
com.cliffc.aa.util.Ary.addAll
Ary< E > addAll(Ary<? extends E > c)
Definition: Ary.java:163
com.cliffc.aa.util.Ary.insert
void insert(int i, E e)
Slow, linear-time, element insert.
Definition: Ary.java:67
com.cliffc.aa.util.Ary.range_check
void range_check(int i)
Definition: Ary.java:307
com.cliffc.aa.util.Ary.pop
E pop()
Definition: Ary.java:41
com.cliffc.aa.util.Ary.iterator
Iterator< E > iterator()
Definition: Ary.java:291
com.cliffc.aa.util.Ary.addAll
Ary< E > addAll(Collection<? extends E > c)
Definition: Ary.java:151
com.cliffc.aa.util.Ary.del
E del(E e)
Element removal, using '=='.
Definition: Ary.java:88
com.cliffc.aa.util.Ary
Definition: Ary.java:11
com.cliffc.aa.util.Ary.hashCode
int hashCode()
Definition: Ary.java:326
com.cliffc.aa.util.Ary._len
int _len
Definition: Ary.java:13
com.cliffc.aa.util.Ary._es
E[] _es
Definition: Ary.java:12
com.cliffc.aa.util.Ary.clear
void clear()
Remove all elements.
Definition: Ary.java:110
com.cliffc.aa.util.Ary.atX
E atX(int i)
Definition: Ary.java:31
com.cliffc.aa.util.Ary.toString
String toString()
Definition: Ary.java:298
com.cliffc.aa.util.Ary.addAll
public< F extends E > Ary< E > addAll(F[] es)
Definition: Ary.java:154
Iterable
com.cliffc.aa.util.Ary.filter_update
Ary< E > filter_update(Predicate< E > P)
Definition: Ary.java:179
com.cliffc.aa.util.Ary.asAry
E[] asAry()
Definition: Ary.java:172
com.cliffc.aa.util.Ary.add
Ary< E > add(E e)
Add element in amortized constant time.
Definition: Ary.java:49
com.cliffc.aa.util.Ary.Iter.hasNext
boolean hasNext()
Definition: Ary.java:294
com.cliffc.aa.util.Ary.setX
E setX(int i, E e)
Definition: Ary.java:115
com.cliffc.aa.util.Ary.clear
void clear(int i)
Clear element.
Definition: Ary.java:126
com.cliffc.aa.util.Ary.last
E last()
Definition: Ary.java:35
com.cliffc.aa.util.Ary.deepCopy
Ary< E > deepCopy()
Definition: Ary.java:333
com.cliffc.aa.util.Ary.Iter
Definition: Ary.java:292
com.cliffc.aa.util.SB
Tight/tiny StringBuilder wrapper.
Definition: SB.java:8
com.cliffc.aa.util.Ary.Ary
Ary(E[] es, int len)
Definition: Ary.java:15
com.cliffc.aa.util.Ary.merge_or
static< X > Ary< X > merge_or(Ary< X > a0, Ary< X > a1, Comparator< X > cmpr, Predicate< X > filter)
Merge-Or.
Definition: Ary.java:249
com.cliffc.aa.util.Ary.merge_or
static< X extends Comparable< X > Ary< X > merge_or(Ary< X > a0, Ary< X > a1)
Merge-Or.
Definition: Ary.java:222
com.cliffc.aa.util.SB.p
SB p(String s)
Definition: SB.java:13
com.cliffc.aa.util.Ary.sort_update
void sort_update(Comparator<? super E > c)
Sorts in-place.
Definition: Ary.java:187
com.cliffc.aa.util.Ary.equals
boolean equals(Object o)
Definition: Ary.java:315
com.cliffc.aa.util.Ary.del
E del(int i)
Fast, constant-time, element removal.
Definition: Ary.java:78
com.cliffc.aa.util.Ary.find
int find(Predicate< E > P)
Find the first element matching predicate P, or -1 if none.
Definition: Ary.java:200
com.cliffc.aa.util.Ary.find
int find(E e)
Find the first matching element using ==, or -1 if none.
Definition: Ary.java:192
com.cliffc.aa.util.Ary.map_update
Ary< E > map_update(Function< E, E > f)
Definition: Ary.java:175
com.cliffc.aa.util.Ary.Iter._i
int _i
Definition: Ary.java:293
com.cliffc.aa.util.Ary.len
int len()
Definition: Ary.java:22
com.cliffc.aa.util.Ary.replace
boolean replace(E old, E nnn)
Find and replace the first matching element using ==.
Definition: Ary.java:208
com.cliffc.aa.util.SB.toString
String toString()
Definition: SB.java:62
com.cliffc.aa.util.Ary.Ary
Ary(E[] es)
Definition: Ary.java:14
com.cliffc.aa.util.Ary.merge_and
static< X extends Comparable< X > Ary< X > merge_and(Ary< X > a0, Ary< X > a1)
Merge-And.
Definition: Ary.java:275