/* * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$) * Copyright (C) $$Year-Rel$$ 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 java.util.Comparator; /** * A comparator that orders ranges by either start position or end position * ascending. If the position matches, ordering is resolved by end position (or * start position). * * @author gmcarstairs * */ public class RangeComparator implements Comparator { public static final Comparator BY_START_POSITION = new RangeComparator( true); public static final Comparator BY_END_POSITION = new RangeComparator( false); boolean byStart; /** * Constructor * * @param byStartPosition * if true, order based on start position, if false by end position */ RangeComparator(boolean byStartPosition) { byStart = byStartPosition; } @Override public int compare(ContiguousI o1, ContiguousI o2) { int len1 = o1.getEnd() - o1.getBegin(); int len2 = o2.getEnd() - o2.getBegin(); if (byStart) { return compare(o1.getBegin(), o2.getBegin(), len1, len2); } else { return compare(o1.getEnd(), o2.getEnd(), len1, len2); } } /** * Compares two ranges for ordering * * @param pos1 * first range positional ordering criterion * @param pos2 * second range positional ordering criterion * @param len1 * first range length ordering criterion * @param len2 * second range length ordering criterion * @return */ public int compare(long pos1, long pos2, int len1, int len2) { int order = Long.compare(pos1, pos2); if (order == 0) { /* * if tied on position order, longer length sorts to left * i.e. the negation of normal ordering by length */ order = -Integer.compare(len1, len2); } return order; } }