// Copyright 2015 The Project Buendia Authors // // Licensed under the Apache License, Version 2.0 (the "License"); you may not // use this file except in compliance with the License. You may obtain a copy // of the License at: http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software distrib- // uted under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES // OR CONDITIONS OF ANY KIND, either express or implied. See the License for // specific language governing permissions and limitations under the License. package org.projectbuendia.client.models; import org.projectbuendia.client.utils.Utils; import java.util.Comparator; import java.util.List; /** Compares {@link Location}s based on specificity, logical zone order, and alphanumeric order. */ public class LocationComparator implements Comparator<Location> { private LocationTree mTree; public LocationComparator(LocationTree tree) { mTree = tree; } @Override public int compare(Location lhs, Location rhs) { List<Location> pathA = mTree.getAncestorsStartingFromRoot(lhs); List<Location> pathB = mTree.getAncestorsStartingFromRoot(rhs); for (int i = 0; i < Math.min(pathA.size(), pathB.size()); i++) { Location locationA = pathA.get(i); Location locationB = pathB.get(i); int result = (i == LocationTree.ABSOLUTE_DEPTH_ZONE) ? Zones.compare(locationA, locationB) : Utils.alphanumericComparator.compare(locationA.name, locationB.name); if (result != 0) { return result; } } return pathA.size() - pathB.size(); } }