001 package com.thaiopensource.validate.nrl; 002 003 class IntSet { 004 static private final int INIT_SIZE = 4; 005 private int[] v = null; 006 private int len = 0; 007 008 void add(int n) { 009 if (v == null) { 010 v = new int[INIT_SIZE]; 011 v[0] = n; 012 len = 1; 013 return; 014 } 015 if (len == v.length) { 016 int[] newv = new int[len*2]; 017 System.arraycopy(v, 0, newv, 0, len); 018 v = newv; 019 } 020 if (n > v[len - 1]) { 021 v[len++] = n; 022 return; 023 } 024 int i = 0; 025 for (; i < len; i++) { 026 if (n <= v[i]) { 027 if (n == v[i]) 028 return; 029 break; 030 } 031 } 032 for (int j = len; j >= i; j--) 033 v[j + 1] = v[j]; 034 v[i] = n; 035 ++len; 036 } 037 038 void addAll(IntSet is) { 039 if (is.len == 0) 040 return; 041 int[] newv = new int[len + is.len]; 042 int i = 0, j = 0, k = 0; 043 while (i < len && j < is.len) { 044 if (v[i] < is.v[j]) 045 newv[k++] = v[i++]; 046 else if (is.v[j] < v[i]) 047 newv[k++] = is.v[j++]; 048 else { 049 newv[k++] = v[i++]; 050 j++; 051 } 052 } 053 while (i < len) 054 newv[k++] = v[i++]; 055 while (j < is.len) 056 newv[k++] = is.v[j++]; 057 v = newv; 058 len = k; 059 } 060 061 int size() { 062 return len; 063 } 064 065 int get(int i) { 066 if (i >= len) 067 throw new IndexOutOfBoundsException(); 068 try { 069 return v[i]; 070 } 071 catch (NullPointerException e) { 072 throw new IndexOutOfBoundsException(); 073 } 074 } 075 }