diff options
Diffstat (limited to 'src/de/lmu/ifi/dbs/elki/database/ids/generic')
7 files changed, 196 insertions, 32 deletions
diff --git a/src/de/lmu/ifi/dbs/elki/database/ids/generic/DBIDIterAdapter.java b/src/de/lmu/ifi/dbs/elki/database/ids/generic/DBIDIterAdapter.java index c517ea9f..91e307c2 100644 --- a/src/de/lmu/ifi/dbs/elki/database/ids/generic/DBIDIterAdapter.java +++ b/src/de/lmu/ifi/dbs/elki/database/ids/generic/DBIDIterAdapter.java @@ -1,10 +1,5 @@ package de.lmu.ifi.dbs.elki.database.ids.generic; -import java.util.Iterator; - -import de.lmu.ifi.dbs.elki.database.ids.DBID; -import de.lmu.ifi.dbs.elki.database.ids.DBIDIter; - /* This file is part of ELKI: Environment for Developing KDD-Applications Supported by Index-Structures @@ -28,12 +23,18 @@ import de.lmu.ifi.dbs.elki.database.ids.DBIDIter; along with this program. If not, see <http://www.gnu.org/licenses/>. */ +import java.util.Iterator; + +import de.lmu.ifi.dbs.elki.database.ids.DBID; +import de.lmu.ifi.dbs.elki.database.ids.DBIDMIter; +import de.lmu.ifi.dbs.elki.database.ids.DBIDRef; + /** * Iterator for classic collections. * * @author Erich Schubert */ -public class DBIDIterAdapter implements DBIDIter { +public class DBIDIterAdapter implements DBIDMIter { /** * Current DBID */ @@ -79,4 +80,21 @@ public class DBIDIterAdapter implements DBIDIter { public DBID getDBID() { return cur; } + + @Override + public void remove() { + iter.remove(); + } + + @Override + public boolean sameDBID(DBIDRef other) { + return cur.getIntegerID() == other.getIntegerID(); + } + + @Override + public int compareDBID(DBIDRef o) { + final int thisVal = cur.getIntegerID(); + final int anotherVal = o.getIntegerID(); + return (thisVal < anotherVal ? -1 : (thisVal == anotherVal ? 0 : 1)); + } }
\ No newline at end of file diff --git a/src/de/lmu/ifi/dbs/elki/database/ids/generic/GenericArrayModifiableDBIDs.java b/src/de/lmu/ifi/dbs/elki/database/ids/generic/GenericArrayModifiableDBIDs.java index f271180d..f02c5064 100644 --- a/src/de/lmu/ifi/dbs/elki/database/ids/generic/GenericArrayModifiableDBIDs.java +++ b/src/de/lmu/ifi/dbs/elki/database/ids/generic/GenericArrayModifiableDBIDs.java @@ -30,6 +30,8 @@ import java.util.Comparator; import de.lmu.ifi.dbs.elki.database.ids.ArrayModifiableDBIDs; import de.lmu.ifi.dbs.elki.database.ids.DBID; import de.lmu.ifi.dbs.elki.database.ids.DBIDIter; +import de.lmu.ifi.dbs.elki.database.ids.DBIDMIter; +import de.lmu.ifi.dbs.elki.database.ids.DBIDRef; import de.lmu.ifi.dbs.elki.database.ids.DBIDs; /** @@ -80,7 +82,7 @@ public class GenericArrayModifiableDBIDs extends ArrayList<DBID> implements Arra public boolean addDBIDs(DBIDs ids) { super.ensureCapacity(size() + ids.size()); boolean changed = false; - for(DBID id : ids) { + for(DBIDIter id = ids.iter(); id.valid(); id.advance()) { changed |= add(id); } return changed; @@ -89,15 +91,20 @@ public class GenericArrayModifiableDBIDs extends ArrayList<DBID> implements Arra @Override public boolean removeDBIDs(DBIDs ids) { boolean changed = false; - for(DBID id : ids) { + for(DBIDIter id = ids.iter(); id.valid(); id.advance()) { changed |= super.remove(id); } return changed; } @Override - public boolean remove(DBID id) { - return super.remove(id); + public boolean add(DBIDRef id) { + return add(id.getDBID()); + } + + @Override + public boolean remove(DBIDRef id) { + return super.remove(id.getDBID()); } @Override @@ -111,17 +118,22 @@ public class GenericArrayModifiableDBIDs extends ArrayList<DBID> implements Arra } @Override - public DBIDIter iter() { + public DBIDMIter iter() { return new DBIDIterAdapter(iterator()); } @Override - public int binarySearch(DBID key) { - return Collections.binarySearch(this, key); + public int binarySearch(DBIDRef key) { + return Collections.binarySearch(this, key.getDBID()); } @Override - public boolean contains(DBID o) { + public boolean contains(DBIDRef o) { return super.contains(o); } + + @Override + public void swap(int a, int b) { + set(a, set(b, get(a))); + } }
\ No newline at end of file diff --git a/src/de/lmu/ifi/dbs/elki/database/ids/generic/GenericHashSetModifiableDBIDs.java b/src/de/lmu/ifi/dbs/elki/database/ids/generic/GenericHashSetModifiableDBIDs.java index 31a8602c..6eadf0b1 100644 --- a/src/de/lmu/ifi/dbs/elki/database/ids/generic/GenericHashSetModifiableDBIDs.java +++ b/src/de/lmu/ifi/dbs/elki/database/ids/generic/GenericHashSetModifiableDBIDs.java @@ -24,10 +24,11 @@ package de.lmu.ifi.dbs.elki.database.ids.generic; */ import java.util.HashSet; -import java.util.Iterator; import de.lmu.ifi.dbs.elki.database.ids.DBID; import de.lmu.ifi.dbs.elki.database.ids.DBIDIter; +import de.lmu.ifi.dbs.elki.database.ids.DBIDMIter; +import de.lmu.ifi.dbs.elki.database.ids.DBIDRef; import de.lmu.ifi.dbs.elki.database.ids.DBIDs; import de.lmu.ifi.dbs.elki.database.ids.HashSetModifiableDBIDs; @@ -72,7 +73,7 @@ public class GenericHashSetModifiableDBIDs extends HashSet<DBID> implements Hash */ public GenericHashSetModifiableDBIDs(DBIDs c) { super(c.size()); - for(DBID id : c) { + for(DBIDIter id = c.iter(); id.valid(); id.advance()) { add(id); } } @@ -80,7 +81,7 @@ public class GenericHashSetModifiableDBIDs extends HashSet<DBID> implements Hash @Override public boolean addDBIDs(DBIDs ids) { boolean changed = false; - for(DBID id : ids) { + for(DBIDIter id = ids.iter(); id.valid(); id.advance()) { changed |= add(id); } return changed; @@ -89,23 +90,27 @@ public class GenericHashSetModifiableDBIDs extends HashSet<DBID> implements Hash @Override public boolean removeDBIDs(DBIDs ids) { boolean changed = false; - for(DBID id : ids) { + for(DBIDIter id = ids.iter(); id.valid(); id.advance()) { changed |= super.remove(id); } return changed; } @Override - public boolean remove(DBID id) { - return super.remove(id); + public boolean add(DBIDRef id) { + return super.add(id.getDBID()); + } + + @Override + public boolean remove(DBIDRef id) { + return super.remove(id.getDBID()); } @Override public boolean retainAll(DBIDs ids) { boolean modified = false; - Iterator<DBID> it = iterator(); - while(it.hasNext()) { - if(!ids.contains(it.next())) { + for(DBIDMIter it = iter(); it.valid(); it.advance()) { + if(!ids.contains(it)) { it.remove(); modified = true; } @@ -114,12 +119,12 @@ public class GenericHashSetModifiableDBIDs extends HashSet<DBID> implements Hash } @Override - public DBIDIter iter() { + public DBIDMIter iter() { return new DBIDIterAdapter(iterator()); } @Override - public boolean contains(DBID o) { + public boolean contains(DBIDRef o) { return super.contains(o); } }
\ No newline at end of file diff --git a/src/de/lmu/ifi/dbs/elki/database/ids/generic/MaskedDBIDs.java b/src/de/lmu/ifi/dbs/elki/database/ids/generic/MaskedDBIDs.java index 67c84290..13a6cc21 100644 --- a/src/de/lmu/ifi/dbs/elki/database/ids/generic/MaskedDBIDs.java +++ b/src/de/lmu/ifi/dbs/elki/database/ids/generic/MaskedDBIDs.java @@ -29,6 +29,7 @@ import java.util.Iterator; import de.lmu.ifi.dbs.elki.database.ids.ArrayDBIDs; import de.lmu.ifi.dbs.elki.database.ids.DBID; import de.lmu.ifi.dbs.elki.database.ids.DBIDIter; +import de.lmu.ifi.dbs.elki.database.ids.DBIDRef; import de.lmu.ifi.dbs.elki.database.ids.DBIDs; /** @@ -36,7 +37,7 @@ import de.lmu.ifi.dbs.elki.database.ids.DBIDs; * * @author Erich Schubert * - * @apiviz.uses de.lmu.ifi.dbs.elki.database.ids.DBIDs + * @apiviz.uses DBIDs */ public class MaskedDBIDs implements DBIDs { /** @@ -99,10 +100,10 @@ public class MaskedDBIDs implements DBIDs { } @Override - public boolean contains(DBID o) { + public boolean contains(DBIDRef o) { // TODO: optimize. for(DBID id : this) { - if(id.equals(o)) { + if(id.sameDBID(o)) { return true; } } @@ -191,6 +192,18 @@ public class MaskedDBIDs implements DBIDs { public DBID getDBID() { return data.get(pos); } + + @Override + public boolean sameDBID(DBIDRef other) { + return getIntegerID() == other.getIntegerID(); + } + + @Override + public int compareDBID(DBIDRef o) { + final int thisVal = getIntegerID(); + final int anotherVal = o.getIntegerID(); + return (thisVal < anotherVal ? -1 : (thisVal == anotherVal ? 0 : 1)); + } } /** @@ -253,7 +266,7 @@ public class MaskedDBIDs implements DBIDs { @Override public boolean valid() { - return pos >= 0; + return (pos >= 0) && (pos < data.size()); } @Override @@ -270,5 +283,17 @@ public class MaskedDBIDs implements DBIDs { public DBID getDBID() { return data.get(pos); } + + @Override + public boolean sameDBID(DBIDRef other) { + return getIntegerID() == other.getIntegerID(); + } + + @Override + public int compareDBID(DBIDRef o) { + final int thisVal = getIntegerID(); + final int anotherVal = o.getIntegerID(); + return (thisVal < anotherVal ? -1 : (thisVal == anotherVal ? 0 : 1)); + } } -} +}
\ No newline at end of file diff --git a/src/de/lmu/ifi/dbs/elki/database/ids/generic/MergedDBIDs.java b/src/de/lmu/ifi/dbs/elki/database/ids/generic/MergedDBIDs.java index 97743867..16d83a56 100644 --- a/src/de/lmu/ifi/dbs/elki/database/ids/generic/MergedDBIDs.java +++ b/src/de/lmu/ifi/dbs/elki/database/ids/generic/MergedDBIDs.java @@ -27,6 +27,7 @@ import java.util.Iterator; import de.lmu.ifi.dbs.elki.database.ids.DBID; import de.lmu.ifi.dbs.elki.database.ids.DBIDIter; +import de.lmu.ifi.dbs.elki.database.ids.DBIDRef; import de.lmu.ifi.dbs.elki.database.ids.DBIDs; import de.lmu.ifi.dbs.elki.utilities.exceptions.AbortException; @@ -79,7 +80,7 @@ public class MergedDBIDs implements DBIDs { } @Override - public boolean contains(DBID o) { + public boolean contains(DBIDRef o) { for(DBIDs child : childs) { if(child.contains(o)) { return true; diff --git a/src/de/lmu/ifi/dbs/elki/database/ids/generic/UnmodifiableArrayDBIDs.java b/src/de/lmu/ifi/dbs/elki/database/ids/generic/UnmodifiableArrayDBIDs.java new file mode 100644 index 00000000..35b092c2 --- /dev/null +++ b/src/de/lmu/ifi/dbs/elki/database/ids/generic/UnmodifiableArrayDBIDs.java @@ -0,0 +1,101 @@ +package de.lmu.ifi.dbs.elki.database.ids.generic; + +/* + This file is part of ELKI: + Environment for Developing KDD-Applications Supported by Index-Structures + + Copyright (C) 2012 + Ludwig-Maximilians-Universität München + Lehr- und Forschungseinheit für Datenbanksysteme + ELKI Development Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +import java.util.Iterator; + +import de.lmu.ifi.dbs.elki.database.ids.ArrayDBIDs; +import de.lmu.ifi.dbs.elki.database.ids.ArrayStaticDBIDs; +import de.lmu.ifi.dbs.elki.database.ids.DBID; +import de.lmu.ifi.dbs.elki.database.ids.DBIDIter; +import de.lmu.ifi.dbs.elki.database.ids.DBIDRef; +import de.lmu.ifi.dbs.elki.utilities.iterator.UnmodifiableIterator; + +/** + * Unmodifiable wrapper for DBIDs. + * + * @author Erich Schubert + * + * @apiviz.uses de.lmu.ifi.dbs.elki.database.ids.DBIDs + */ +public class UnmodifiableArrayDBIDs implements ArrayStaticDBIDs { + /** + * The DBIDs we wrap. + */ + final private ArrayDBIDs inner; + + /** + * Constructor. + * + * @param inner Inner DBID collection. + */ + public UnmodifiableArrayDBIDs(ArrayDBIDs inner) { + super(); + this.inner = inner; + } + + @Override + public boolean contains(DBIDRef o) { + return inner.contains(o); + } + + @Override + public boolean isEmpty() { + return inner.isEmpty(); + } + + @SuppressWarnings("deprecation") + @Override + public Iterator<DBID> iterator() { + return new UnmodifiableIterator<DBID>(inner.iterator()); + } + + @Override + public DBIDIter iter() { + return inner.iter(); + } + + @Override + public int size() { + return inner.size(); + } + + /** + * Returns a string representation of the inner DBID collection. + */ + @Override + public String toString() { + return inner.toString(); + } + + @Override + public DBID get(int i) { + return inner.get(i); + } + + @Override + public int binarySearch(DBIDRef key) { + return inner.binarySearch(key); + } +}
\ No newline at end of file diff --git a/src/de/lmu/ifi/dbs/elki/database/ids/generic/UnmodifiableDBIDs.java b/src/de/lmu/ifi/dbs/elki/database/ids/generic/UnmodifiableDBIDs.java index bd68e2fb..682b2e4b 100644 --- a/src/de/lmu/ifi/dbs/elki/database/ids/generic/UnmodifiableDBIDs.java +++ b/src/de/lmu/ifi/dbs/elki/database/ids/generic/UnmodifiableDBIDs.java @@ -27,6 +27,7 @@ import java.util.Iterator; import de.lmu.ifi.dbs.elki.database.ids.DBID; import de.lmu.ifi.dbs.elki.database.ids.DBIDIter; +import de.lmu.ifi.dbs.elki.database.ids.DBIDRef; import de.lmu.ifi.dbs.elki.database.ids.DBIDs; import de.lmu.ifi.dbs.elki.database.ids.StaticDBIDs; import de.lmu.ifi.dbs.elki.utilities.iterator.UnmodifiableIterator; @@ -55,7 +56,7 @@ public class UnmodifiableDBIDs implements StaticDBIDs { } @Override - public boolean contains(DBID o) { + public boolean contains(DBIDRef o) { return inner.contains(o); } @@ -64,6 +65,7 @@ public class UnmodifiableDBIDs implements StaticDBIDs { return inner.isEmpty(); } + @SuppressWarnings("deprecation") @Override public Iterator<DBID> iterator() { return new UnmodifiableIterator<DBID>(inner.iterator()); |