Not logged in.  Login/Logout/Register | List snippets | | Create snippet | Upload image | Upload data

144
LINES

< > BotCompany Repo | #1025510 // TokenIndexedList3 [using treeset in index, OK]

JavaX fragment (include) [tags: use-pretranspiled]

Libraryless. Click here for Pure Java version (4771L/27K).

// A version of ContentsIndexedList specialized for tokens

// optimized for search - O(1) for searching for a token
// set is O(log m) with m = number of occurrences of token
final sclass TokenIndexedList3 extends RandomAccessAbstractList<S> implements IContentsIndexedList<S>, IContentsIndexedList2<S> {
  final new HashMap<S, TreeSet<Token>> index; // tokens by contents, sorted by index
  final new ArrayList<Token> list;

  final sclass Token extends HasIndex {
    S s; // actual token
    
    toString { ret "Token " + quote(s) + "@" + idx; }
  }
  
  *() {}
  *(Collection<S> l) { addAll(l); }
  
  public S get(int i) { ret list.get(i).s; }
  public int size() { ret list.size(); }
  
  public S set(int i, S s) {
    Token t = list.get(i);
    S old = t.s;
    if (eq(old, s)) ret old;
    removeFromIdx(t);
    t.s = s;
    addToIdx(t);
    ret old;
  }
  
  public bool add(S s) {
    ++modCount;
    new Token t;
    t.s = s;
    t.idx = size();
    list.add(t);
    addToIdx(t);
    true;
  }
  
  public void add(int i, S s) {
    ++modCount;
    new Token t;
    t.s = s;
    t.idx = i;
    list.add(i, t);
    reorder(i+1);
    addToIdx(t);
  }
  
  public bool addAll(int i, Collection<? extends S> l) {
    int n = l.size();
    if (n == 0) false;
    ++modCount;
    L<Token> l2 = emptyList(n);
    int j = i;
    for (S s : l) {
      new Token t;
      t.s = s;
      t.idx = j++;
      l2.add(t);
    }
    list.addAll(i, l2);
    reorder(i+n);
    for (Token t : l2)
      addToIdx(t);
    true;
  }
  
  public S remove(int i) {
    ++modCount;
    Token t = list.get(i);
    removeFromIdx(t);
    list.remove(i);
    reorder(i);
    ret t.s;
  }
  
  void reorder(int fromIdx) {
    int n = size();
    for (int i = fromIdx; i < n; i++)
      list.get(i).idx = i;
  }
  
  void removeFromIdx(Token t) {
    TreeSet<Token> idx = index.get(t.s);
    idx.remove(t);
    if (idx.isEmpty()) index.remove(t.s);
  }
  
  void addToIdx(Token t) {
    TreeSet<Token> idx = index.get(t.s);
    if (idx == null)
      index.put(t.s, idx = new TreeSet);
    idx.add(t);
  }
  
  @Override
  public int indexOf(O s) {
    TreeSet<Token> l = index.get(s);
    ret l == null ? -1 : first(l).idx;
  }
  
  @Override
  public int lastIndexOf(O s) {
    TreeSet<Token> l = index.get(s);
    ret l == null ? -1 : last(l).idx;
  }
  
  @Override
  public bool contains(O s) {
    ret index.containsKey(s);
  }
  
  public void clear() {
    ++modCount;
    index.clear();
    list.clear();
  }
  
  protected void removeRange(int fromIndex, int toIndex) {
    if (fromIndex == toIndex) ret;
    ++modCount;
    
    for (int i = fromIndex; i < toIndex; i++)
      removeFromIdx(list.get(i));
      
    list.subList(fromIndex, toIndex).clear();
    reorder(fromIndex);
  }
  
  public int[] indicesOf(S o) {
    TreeSet<Token> idx = index.get(o);
    if (idx == null) ret emptyIntArray();
    int[] a = new int[idx.size()];
    int i = 0;
    for (Token t : idx) a[i++] = t.idx;
    ret a;
  }
  
  public TreeSet<HasIndex> indicesOf_treeSetOfHasIndex(S o) {
    ret (TreeSet) index.get(o);
  }
}

Author comment

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: 271 / 772
Version history: 24 change(s)
Referenced in: [show references]