1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-04-29 19:45:01 +02:00

Added toString method and generics.

This commit is contained in:
Sergey Prigogin 2008-02-10 07:05:43 +00:00
parent d64fdf7905
commit 8111176e94
2 changed files with 77 additions and 49 deletions

View file

@ -25,7 +25,7 @@ public class HashTable implements Cloneable{
return currEntry == -1; return currEntry == -1;
} }
final public int size(){ final public int size() {
return currEntry + 1; return currEntry + 1;
} }
@ -47,20 +47,20 @@ public class HashTable implements Cloneable{
} }
} }
public Object clone(){ public Object clone() {
HashTable newTable = null; HashTable newTable = null;
try { try {
newTable = (HashTable) super.clone(); newTable = (HashTable) super.clone();
} catch ( CloneNotSupportedException e ) { } catch (CloneNotSupportedException e) {
//shouldn't happen because object supports clone. //shouldn't happen because object supports clone.
return null; return null;
} }
int size = capacity(); int size = capacity();
if( hashTable != null ){ if (hashTable != null) {
newTable.hashTable = new int[ size*2 ]; newTable.hashTable = new int[size * 2];
newTable.nextTable = new int[ size ]; newTable.nextTable = new int[size];
System.arraycopy(hashTable, 0, newTable.hashTable, 0, hashTable.length); System.arraycopy(hashTable, 0, newTable.hashTable, 0, hashTable.length);
System.arraycopy(nextTable, 0, newTable.nextTable, 0, nextTable.length); System.arraycopy(nextTable, 0, newTable.nextTable, 0, nextTable.length);
} }
@ -79,7 +79,7 @@ public class HashTable implements Cloneable{
if (hashTable == null) if (hashTable == null)
return; return;
for( int i = 0; i < capacity(); i++ ){ for (int i = 0; i < capacity(); i++) {
hashTable[2*i] = 0; hashTable[2*i] = 0;
hashTable[2*i+1] = 0; hashTable[2*i+1] = 0;
nextTable[i] = 0; nextTable[i] = 0;
@ -90,7 +90,7 @@ public class HashTable implements Cloneable{
return; return;
// clear the table (don't call clear() or else the subclasses stuff will be cleared too) // clear the table (don't call clear() or else the subclasses stuff will be cleared too)
for( int i = 0; i < capacity(); i++ ){ for (int i = 0; i < capacity(); i++) {
hashTable[2*i] = 0; hashTable[2*i] = 0;
hashTable[2*i+1] = 0; hashTable[2*i+1] = 0;
nextTable[i] = 0; nextTable[i] = 0;
@ -128,7 +128,7 @@ public class HashTable implements Cloneable{
// need to link // need to link
int j = hashTable[hash] - 1; int j = hashTable[hash] - 1;
while (nextTable[j] != 0) { while (nextTable[j] != 0) {
// if(nextTable[j] - 1 == j) { // if (nextTable[j] - 1 == j) {
// break; // break;
// } // }
j = nextTable[j] - 1; j = nextTable[j] - 1;
@ -144,15 +144,15 @@ public class HashTable implements Cloneable{
} }
protected void removeEntry(int i, int hash) { protected void removeEntry(int i, int hash) {
if (nextTable == null){ if (nextTable == null) {
--currEntry; --currEntry;
return; return;
} }
// Remove the hash entry // Remove the hash entry
if (hashTable[hash] == i + 1) if (hashTable[hash] == i + 1) {
hashTable[hash] = nextTable[i]; hashTable[hash] = nextTable[i];
else { } else {
// find entry pointing to me // find entry pointing to me
int j = hashTable[hash] - 1; int j = hashTable[hash] - 1;
while (nextTable[j] != 0 && nextTable[j] != i + 1) while (nextTable[j] != 0 && nextTable[j] != i + 1)
@ -165,35 +165,37 @@ public class HashTable implements Cloneable{
System.arraycopy(nextTable, i + 1, nextTable, i, currEntry - i); System.arraycopy(nextTable, i + 1, nextTable, i, currEntry - i);
// adjust hash and next entries for things that moved // adjust hash and next entries for things that moved
for (int j = 0; j < hashTable.length; ++j) for (int j = 0; j < hashTable.length; ++j) {
if (hashTable[j] > i + 1) if (hashTable[j] > i + 1)
--hashTable[j]; --hashTable[j];
}
for (int j = 0; j < nextTable.length; ++j) for (int j = 0; j < nextTable.length; ++j) {
if (nextTable[j] > i + 1) if (nextTable[j] > i + 1)
--nextTable[j]; --nextTable[j];
} }
}
// last entry is now free // last entry is now free
nextTable[currEntry] = 0; nextTable[currEntry] = 0;
--currEntry; --currEntry;
} }
final public void sort( Comparator c ) { final public void sort(Comparator<Object> c) {
if( size() > 1 ){ if (size() > 1) {
quickSort( c, 0, size() - 1 ); quickSort(c, 0, size() - 1);
rehash(); rehash();
} }
} }
final private void quickSort( Comparator c, int p, int r ){ final private void quickSort(Comparator<Object> c, int p, int r) {
if( p < r ){ if (p < r) {
int q = partition( c, p, r ); int q = partition(c, p, r);
if( p < q ) quickSort( c, p, q ); if (p < q) quickSort(c, p, q);
if( ++q < r ) quickSort( c, q, r ); if (++q < r) quickSort(c, q, r);
} }
} }
protected int partition( Comparator c, int p, int r ) { protected int partition(Comparator<Object> c, int p, int r) {
throw new UnsupportedOperationException(); throw new UnsupportedOperationException();
} }

View file

@ -23,29 +23,29 @@ import java.util.List;
* @author aniefer * @author aniefer
*/ */
public class ObjectMap extends ObjectTable { public class ObjectMap extends ObjectTable {
public static final ObjectMap EMPTY_MAP = new ObjectMap( 0 ){ public static final ObjectMap EMPTY_MAP = new ObjectMap(0) {
public Object clone() { return this; } public Object clone() { return this; }
public List toList() { return Collections.EMPTY_LIST; } public List<Object> toList() { return Collections.emptyList(); }
public Object put( Object key, Object value ) { throw new UnsupportedOperationException(); } public Object put(Object key, Object value) { throw new UnsupportedOperationException(); }
}; };
private Object[] valueTable; private Object[] valueTable;
public ObjectMap(int initialSize) { public ObjectMap(int initialSize) {
super( initialSize ); super(initialSize);
valueTable = new Object[ capacity() ]; valueTable = new Object[capacity()];
} }
public Object clone(){ public Object clone() {
ObjectMap newMap = (ObjectMap) super.clone(); ObjectMap newMap = (ObjectMap) super.clone();
newMap.valueTable = new Object[ capacity() ]; newMap.valueTable = new Object[capacity()];
System.arraycopy(valueTable, 0, newMap.valueTable, 0, valueTable.length); System.arraycopy(valueTable, 0, newMap.valueTable, 0, valueTable.length);
return newMap; return newMap;
} }
final public void clear(){ final public void clear() {
super.clear(); super.clear();
for( int i = 0; i < valueTable.length; i++ ){ for(int i = 0; i < valueTable.length; i++) {
valueTable[i] = null; valueTable[i] = null;
} }
} }
@ -54,7 +54,7 @@ public class ObjectMap extends ObjectTable {
Object[] oldValueTable = valueTable; Object[] oldValueTable = valueTable;
valueTable = new Object[size]; valueTable = new Object[size];
System.arraycopy(oldValueTable, 0, valueTable, 0, oldValueTable.length); System.arraycopy(oldValueTable, 0, valueTable, 0, oldValueTable.length);
super.resize( size ); super.resize(size);
} }
public Object put(Object key, Object value) { public Object put(Object key, Object value) {
@ -71,15 +71,15 @@ public class ObjectMap extends ObjectTable {
return null; return null;
} }
final public Object getAt( int i ){ final public Object getAt(int i) {
if( i < 0 || i > currEntry ) if (i < 0 || i > currEntry)
return null; return null;
return valueTable[i]; return valueTable[i];
} }
final public Object remove( Object key ) { final public Object remove(Object key) {
if( key == null ) if (key == null)
return null; return null;
int i = lookup(key); int i = lookup(key);
if (i < 0) if (i < 0)
@ -101,18 +101,24 @@ public class ObjectMap extends ObjectTable {
super.removeEntry(i); super.removeEntry(i);
} }
protected int partition( Comparator c, int p, int r ){ @Override
Object x = keyTable[ p ]; protected int partition(Comparator<Object> c, int p, int r) {
Object x = keyTable[p];
Object temp = null; Object temp = null;
int i = p; int i = p;
int j = r; int j = r;
while( true ){ while (true) {
while( c.compare( keyTable[ j ], x ) > 0 ){ j--; } while (c.compare(keyTable[j], x) > 0) {
if( i < j ) j--;
while( c.compare( keyTable[ i ], x ) < 0 ){ i++; } }
if (i < j) {
while (c.compare(keyTable[i], x) < 0) {
i++;
}
}
if( i < j ){ if (i < j) {
temp = keyTable[j]; temp = keyTable[j];
keyTable[j] = keyTable[i]; keyTable[j] = keyTable[i];
keyTable[i] = temp; keyTable[i] = temp;
@ -126,9 +132,29 @@ public class ObjectMap extends ObjectTable {
} }
} }
public Object [] valueArray(){ public Object[] valueArray() {
Object [] vals = new Object[ size() ]; Object[] vals = new Object[size()];
System.arraycopy( valueTable, 0, vals, 0, vals.length ); System.arraycopy(valueTable, 0, vals, 0, vals.length);
return vals; return vals;
} }
public String toString() {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < size(); i++) {
Object key = keyAt(i);
if (key != null) {
if (sb.length() == 0) {
sb.append("{");
} else {
sb.append(", ");
}
Object value = valueTable[i];
sb.append(String.valueOf(key));
sb.append(": ");
sb.append(String.valueOf(value));
}
}
sb.append("}");
return sb.toString();
}
} }