Changeset 6461 in josm for trunk/src/org/openstreetmap/josm/gui/dialogs/relation/sort/RelationSorter.java
- Timestamp:
- 2013-12-09T22:50:12+01:00 (10 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/org/openstreetmap/josm/gui/dialogs/relation/sort/RelationSorter.java
r6316 r6461 6 6 import java.util.Collections; 7 7 import java.util.Comparator; 8 import java.util. HashMap;8 import java.util.LinkedHashMap; 9 9 import java.util.LinkedList; 10 10 import java.util.List; … … 13 13 14 14 import org.openstreetmap.josm.data.osm.RelationMember; 15 import org.openstreetmap.josm.gui.DefaultNameFormatter; 16 import org.openstreetmap.josm.tools.AlphanumComparator; 15 17 16 18 public class RelationSorter { … … 24 26 25 27 static { 26 additionalSorters.add(new AssociatedStreetSorter()); 28 // first adequate sorter is used, so order matters 29 additionalSorters.add(new AssociatedStreetRoleStreetSorter()); 30 additionalSorters.add(new AssociatedStreetRoleAddressHouseSorter()); 27 31 } 28 32 29 33 /** 30 * Class that sorts type=associatedStreet relation's houses. 34 * Class that sorts the {@code street} members of 35 * {@code type=associatedStreet} and {@code type=street} relations. 31 36 */ 32 private static class AssociatedStreet Sorter implements AdditionalSorter {37 private static class AssociatedStreetRoleStreetSorter implements AdditionalSorter { 33 38 34 39 @Override 35 40 public boolean acceptsMember(RelationMember m) { 36 return m != null 37 && m.getRole() != null && m.getRole().equals("house") 38 && m.getMember() != null && m.getMember().get("addr:housenumber") != null; 41 return "street".equals(m.getRole()); 42 } 43 44 @Override 45 public List<RelationMember> sortMembers(List<RelationMember> list) { 46 return sortMembersByConnectivity(list); 47 } 48 } 49 50 /** 51 * Class that sorts the {@code address} and {@code house} members of 52 * {@code type=associatedStreet} and {@code type=street} relations. 53 */ 54 private static class AssociatedStreetRoleAddressHouseSorter implements AdditionalSorter { 55 56 public static final AlphanumComparator ALPHANUM_COMPARATOR = new AlphanumComparator(); 57 58 @Override 59 public boolean acceptsMember(RelationMember m) { 60 return "address".equals(m.getRole()) || "house".equals(m.getRole()); 39 61 } 40 62 … … 44 66 @Override 45 67 public int compare(RelationMember a, RelationMember b) { 46 if (a == b || a.getMember() == b.getMember()) return 0; 47 String addrA = a.getMember().get("addr:housenumber").trim(); 48 String addrB = b.getMember().get("addr:housenumber").trim(); 49 if (addrA.equals(addrB)) return 0; 50 // Strip non-digits (from "1B" addresses for example) 51 String addrAnum = addrA.replaceAll("\\D+", ""); 52 String addrBnum = addrB.replaceAll("\\D+", ""); 53 // Compare only numbers 54 try { 55 Integer res = Integer.parseInt(addrAnum) - Integer.parseInt(addrBnum); 56 if (res != 0) return res; 57 } catch (NumberFormatException e) { 58 // Ignore NumberFormatException. If the number is not composed of digits, strings are compared next 68 final int houseNumber = ALPHANUM_COMPARATOR.compare( 69 a.getMember().get("addr:housenumber"), 70 b.getMember().get("addr:housenumber")); 71 if (houseNumber != 0) { 72 return houseNumber; 59 73 } 60 // Same number ? Compare full strings 61 return addrA.compareTo(addrB); 74 final String aDisplayName = a.getMember().getDisplayName(DefaultNameFormatter.getInstance()); 75 final String bDisplayName = b.getMember().getDisplayName(DefaultNameFormatter.getInstance()); 76 return ALPHANUM_COMPARATOR.compare(aDisplayName, bDisplayName); 62 77 } 63 78 }); … … 77 92 // Sort members with custom mechanisms (relation-dependent) 78 93 List<RelationMember> defaultMembers = new ArrayList<RelationMember>(relationMembers.size()); 79 Map<AdditionalSorter, List<RelationMember>> customMap = new HashMap<AdditionalSorter, List<RelationMember>>(); 94 // Maps sorter to assigned members for sorting. Use LinkedHashMap to retain order. 95 Map<AdditionalSorter, List<RelationMember>> customMap = new LinkedHashMap<AdditionalSorter, List<RelationMember>>(); 80 96 81 // Dispatch members to correct sorters97 // Dispatch members to the first adequate sorter 82 98 for (RelationMember m : relationMembers) { 99 boolean wasAdded = false; 83 100 for (AdditionalSorter sorter : additionalSorters) { 84 List<RelationMember> list = defaultMembers;85 101 if (sorter.acceptsMember(m)) { 102 List<RelationMember> list; 86 103 list = customMap.get(sorter); 87 104 if (list == null) { 88 105 customMap.put(sorter, list = new LinkedList<RelationMember>()); 89 106 } 107 list.add(m); 108 wasAdded = true; 109 break; 90 110 } 91 list.add(m); 111 } 112 if (!wasAdded) { 113 defaultMembers.add(m); 92 114 } 93 115 } … … 97 119 newMembers.addAll(entry.getKey().sortMembers(entry.getValue())); 98 120 } 121 newMembers.addAll(sortMembersByConnectivity(defaultMembers)); 122 return newMembers; 123 } 124 125 public static List<RelationMember> sortMembersByConnectivity(List<RelationMember> defaultMembers) { 126 127 List<RelationMember> newMembers = new ArrayList<RelationMember>(); 99 128 100 129 RelationNodeMap map = new RelationNodeMap(defaultMembers);
Note:
See TracChangeset
for help on using the changeset viewer.