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:
parent
d64fdf7905
commit
8111176e94
2 changed files with 77 additions and 49 deletions
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue