diff --git a/java/src/org/broadinstitute/sting/utils/GenomeLocSortedSet.java b/java/src/org/broadinstitute/sting/utils/GenomeLocSortedSet.java index 53f62b95d..81ca85957 100755 --- a/java/src/org/broadinstitute/sting/utils/GenomeLocSortedSet.java +++ b/java/src/org/broadinstitute/sting/utils/GenomeLocSortedSet.java @@ -3,10 +3,7 @@ package org.broadinstitute.sting.utils; import net.sf.samtools.SAMSequenceDictionary; import net.sf.samtools.SAMSequenceRecord; -import java.util.AbstractSet; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; +import java.util.*; /** * @@ -47,7 +44,7 @@ public class GenomeLocSortedSet extends AbstractSet { /** * get an iterator over this collection * - * @return + * @return an iterator */ public Iterator iterator() { return mArray.iterator(); @@ -56,7 +53,7 @@ public class GenomeLocSortedSet extends AbstractSet { /** * return the size of the collection * - * @return + * @return the size of the collection */ public int size() { return mArray.size(); @@ -79,19 +76,19 @@ public class GenomeLocSortedSet extends AbstractSet { * @return true */ public boolean add(GenomeLoc e) { - if (mArray.contains(e)) { - throw new IllegalArgumentException("attempting to add a duplicate object to the set"); - } - int index = 0; - while (index < mArray.size()) { - if (!e.isPast(mArray.get(index))) { - mArray.add(index, e); + // assuming that the intervals coming arrive in order saves us a fair amount of time (and it's most likely true) + if (mArray.size() > 0 && e.isPast(mArray.get(mArray.size() - 1))) { + mArray.add(e); + return true; + } else { + int loc = Collections.binarySearch(mArray,e); + if (loc >= 0) { + throw new StingException("Genome Loc Sorted Set already contains the GenomicLoc " + e.toString()); + } else { + mArray.add((loc+1) * -1,e); return true; } - ++index; } - this.mArray.add(e); - return true; } /** @@ -237,12 +234,14 @@ public class GenomeLocSortedSet extends AbstractSet { /** * Create a sorted genome location set from a list of GenomeLocs. + * * @param locs the list + * * @return the sorted genome loc list */ public static GenomeLocSortedSet createSetFromList(List locs) { GenomeLocSortedSet set = new GenomeLocSortedSet(); - for (GenomeLoc l: locs) { + for (GenomeLoc l : locs) { set.add(l); } return set; diff --git a/java/test/org/broadinstitute/sting/utils/GenomeLocSortedSetTest.java b/java/test/org/broadinstitute/sting/utils/GenomeLocSortedSetTest.java index 85bd804db..a665ebb4f 100755 --- a/java/test/org/broadinstitute/sting/utils/GenomeLocSortedSetTest.java +++ b/java/test/org/broadinstitute/sting/utils/GenomeLocSortedSetTest.java @@ -78,7 +78,7 @@ public class GenomeLocSortedSetTest extends BaseTest { } - @Test(expected = IllegalArgumentException.class) + @Test(expected = StingException.class) public void testAddDupplicate() { assertTrue(mSortedSet.size() == 0); GenomeLoc g = GenomeLocParser.createGenomeLoc(1, 0, 0);