X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fdatamodel%2Ffeatures%2FNCList.java;h=ebc1908eeb44d9242dd71fac8d7add2123dff193;hb=8dbf6e85ebb3dbcd84635f194457cd4dc65010cf;hp=990688490499622f91e9166e3f5c022aa2185504;hpb=7f4b42c9b73c4e5e101aa2bb390af2d1df9a0f0a;p=jalview.git diff --git a/src/jalview/datamodel/features/NCList.java b/src/jalview/datamodel/features/NCList.java index 9906884..ebc1908 100644 --- a/src/jalview/datamodel/features/NCList.java +++ b/src/jalview/datamodel/features/NCList.java @@ -1,8 +1,30 @@ +/******************************************************************************* + * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$) + * Copyright (C) $(date) The Jalview Authors + * + * This file is part of Jalview. + * + * Jalview is free software: you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 + * of the License, or (at your option) any later version. + * + * Jalview 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Jalview. If not, see . + * The Jalview Authors are detailed in the 'AUTHORS' file. + *******************************************************************************/ package jalview.datamodel.features; +import jalview.datamodel.ContiguousI; +import jalview.datamodel.Range; + import java.util.ArrayList; import java.util.Collections; -import java.util.Comparator; import java.util.List; /** @@ -28,12 +50,6 @@ public class NCList */ private List> subranges; - /* - * a comparator to sort intervals by start position ascending, with - * longer (enclosing) intervals preceding those they enclose - */ - Comparator intervalSorter = new RangeComparator(true); - /** * Constructor given a list of things that are each located on a contiguous * interval. Note that the constructor may reorder the list. @@ -50,6 +66,9 @@ public class NCList } /** + * Sort and group ranges into sublists where each sublist represents a region + * and its contained subregions + * * @param ranges */ protected void build(List ranges) @@ -58,18 +77,18 @@ public class NCList * sort by start ascending so that contained intervals * follow their containing interval */ - Collections.sort(ranges, intervalSorter); + Collections.sort(ranges, RangeComparator.BY_START_POSITION); - List sublists = buildSubranges(ranges); + List sublists = buildSubranges(ranges); /* * convert each subrange to an NCNode consisting of a range and * (possibly) its contained NCList */ - for (SubList sublist : sublists) + for (Range sublist : sublists) { - subranges.add(new NCNode(ranges.subList(sublist.startIndex, - sublist.endIndex + 1))); + subranges.add(new NCNode(ranges.subList(sublist.start, + sublist.end + 1))); } size = ranges.size(); @@ -78,9 +97,8 @@ public class NCList public NCList(T entry) { this(); - List ranges = new ArrayList(); - ranges.add(entry); - build(ranges); + subranges.add(new NCNode<>(entry)); + size = 1; } public NCList() @@ -95,9 +113,9 @@ public class NCList * @param ranges * @return */ - protected List buildSubranges(List ranges) + protected List buildSubranges(List ranges) { - List sublists = new ArrayList(); + List sublists = new ArrayList<>(); if (ranges.isEmpty()) { @@ -118,13 +136,13 @@ public class NCList * this interval is not contained in the preceding one * close off the last sublist */ - sublists.add(new SubList(listStartIndex, i - 1)); + sublists.add(new Range(listStartIndex, i - 1)); listStartIndex = i; } lastEndPos = nextEnd; } - sublists.add(new SubList(listStartIndex, ranges.size() - 1)); + sublists.add(new Range(listStartIndex, ranges.size() - 1)); return sublists; } @@ -176,7 +194,7 @@ public class NCList /* * all subranges precede this one - add it on the end */ - subranges.add(new NCNode(entry)); + subranges.add(new NCNode<>(entry)); return true; } @@ -198,7 +216,7 @@ public class NCList /* * new entry lies between subranges j-1 j */ - subranges.add(j, new NCNode(entry)); + subranges.add(j, new NCNode<>(entry)); return true; } @@ -246,7 +264,7 @@ public class NCList * entry spans two subranges but doesn't enclose any * so just add it */ - subranges.add(j, new NCNode(entry)); + subranges.add(j, new NCNode<>(entry)); return true; } } @@ -267,7 +285,7 @@ public class NCList } else { - subranges.add(new NCNode(entry)); + subranges.add(new NCNode<>(entry)); } return true; @@ -325,9 +343,9 @@ public class NCList protected synchronized void addEnclosingRange(T entry, final int i, final int j) { - NCList newNCList = new NCList(); - newNCList.subranges.addAll(subranges.subList(i, j + 1)); - NCNode newNode = new NCNode(entry, newNCList); + NCList newNCList = new NCList<>(); + newNCList.addNodes(subranges.subList(i, j + 1)); + NCNode newNode = new NCNode<>(entry, newNCList); for (int k = j; k >= i; k--) { subranges.remove(k); @@ -335,6 +353,15 @@ public class NCList subranges.add(i, newNode); } + protected void addNodes(List> nodes) + { + for (NCNode node : nodes) + { + subranges.add(node); + size += node.size(); + } + } + /** * Returns a (possibly empty) list of items whose extent overlaps the given * range @@ -347,7 +374,7 @@ public class NCList */ public List findOverlaps(long from, long to) { - List result = new ArrayList(); + List result = new ArrayList<>(); findOverlaps(from, to, result); @@ -401,8 +428,12 @@ public class NCList */ protected int findFirstOverlap(long from) { - // TODO binary search - // for now quick cheat linear search + /* + * The NCList paper describes binary search for this step, + * but this not implemented here as (a) I haven't understood it yet + * and (b) it seems to imply complications for adding to an NCList + */ + int i = 0; if (subranges != null) { @@ -531,7 +562,7 @@ public class NCList * * @return */ - public int getSize() + public int size() { return size; } @@ -543,7 +574,7 @@ public class NCList */ public List getEntries() { - List result = new ArrayList(); + List result = new ArrayList<>(); getEntries(result); return result; } @@ -594,8 +625,8 @@ public class NCList subranges.remove(i); if (subRegions != null) { - subranges.addAll(i, subRegions.subranges); - Collections.sort(subranges, intervalSorter); + subranges.addAll(subRegions.subranges); + Collections.sort(subranges, RangeComparator.BY_START_POSITION); } size--; return true; @@ -605,6 +636,7 @@ public class NCList if (subRegions != null && subRegions.delete(entry)) { size--; + subrange.deleteSubRegionsIfEmpty(); return true; } }