--- dao/DaoAdresseService/src/main/java/dk/daoas/daoadresseservice/AddressSearch.java 2016/01/19 18:54:49 2834 +++ dao/DaoAdresseService/src/main/java/dk/daoas/daoadresseservice/AddressSearch.java 2016/01/20 11:21:27 2835 @@ -34,7 +34,7 @@ public class AddressSearch { private Map> searchPostnrVejnavnGadeid; - private Map>> searchGadeidentAdresser; // Gadeident -> husnrumre -> litra + private Map>> searchGadeidentAdresser; // Gadeident -> husnrumre -> litra private List
ikkeDaekkedeAdresser = new ArrayList
(60000); private List
hundredePctAdresser = new ArrayList
(120000); @@ -66,15 +66,21 @@ public Address getAddressSafe(int gadeid, short husnr, String litra) throws Exception { - Map> gade = searchGadeidentAdresser.get(gadeid); + Map> gade = searchGadeidentAdresser.get(gadeid); if (gade == null) { throw new Exception("GadeID ikke fundet"); } - Map litraList = gade.get(husnr); + List
litraList = gade.get(husnr); - Address addr = litraList.get(litra); + Address addr = null; + for(Address a : litraList) { + if (a.husnrbogstav.equals(litra) ) { + addr = a; + break; + } + } if (addr == null) { throw new Exception("Adresse ikke ikke fundet"); @@ -181,25 +187,26 @@ result.gadeident = gadeident; - Map> gade = searchGadeidentAdresser.get(gadeident); + Map> gade = searchGadeidentAdresser.get(gadeident); if (gade == null) { //Denne søgning må ikke fejle result.status = Status.ERROR_INTERNAL; return result; } + //Kunne evt klares med Iterables.get fra Guava/Collections - Address firstAddress = gade.values().iterator().next().values().iterator().next(); //Første husnr -> første litra + Address firstAddress = gade.values().iterator().next().get(0); //Første husnr -> første litra result.vej = firstAddress.vejnavn; short husnrSearch = Short.parseShort(result.splitResult.husnr ); - Map litraList = gade.get(husnrSearch); + List
litraList = gade.get(husnrSearch); if (litraList == null) { //Husnr ikke fundet if (naermesteHusnr) { - TreeMap> gadeTreeMap = (TreeMap>) gade; + TreeMap> gadeTreeMap = (TreeMap>) gade; result.anvendtHusnr = NearestShortTreeMap.getNearestKey(husnrSearch, gadeTreeMap); result.nearestHusnr = true; @@ -212,12 +219,18 @@ } } - Address addr = litraList.get( result.splitResult.litra ); + Address addr = null; + for(Address a : litraList) { + if ( a.husnrbogstav.equals( result.splitResult.litra ) ) { + addr = a; + break; + } + } if (addr == null) { //litra ikke fundet if (config.nearestLitra == true || naermesteHusnr == true) { result.nearestLitra = true; - addr = litraList.values().iterator().next(); + addr = litraList.get(0); } else { //husnr fundet men litra blev ikke fundet result.status = Status.ERROR_UNKNOWN_ADDRESSPOINT; @@ -307,7 +320,7 @@ public void buildSearchStructures() throws SQLException{ searchPostnrVejnavnGadeid = new HashMap>(); - searchGadeidentAdresser = new HashMap>>(); + searchGadeidentAdresser = new HashMap>>(); helperCache = new ConcurrentHashMap(); // ////////////////////// @@ -328,6 +341,7 @@ AliasGenerator aliasGenerator = new AliasGenerator(); + ArrayList> litraListCache = new ArrayList>(); for (Address a : alleAdresser) { idAddressMap.put(a.id, a); @@ -357,28 +371,31 @@ } - Map> gade = searchGadeidentAdresser.get(gadeident); + Map> gade = searchGadeidentAdresser.get(gadeident); if (gade == null) { - gade = new TreeMap>(); + gade = new TreeMap >(); searchGadeidentAdresser.put(gadeident, gade); } - Map litraList = gade.get(a.husnr); + List
litraList = gade.get(a.husnr); if (litraList == null) { - litraList = new TreeMap(); + litraList = new ArrayList
(); gade.put(a.husnr, litraList); + + litraListCache.add( (ArrayList
) litraList); } - - litraList.put(a.husnrbogstav, a); + litraList.add(a); + } + + for (ArrayList
list: litraListCache) { + list.trimToSize(); } - aliasGenerator.clear(); //frigiv hukommelse inden stage2 - aliasGenerator = null; + litraListCache.clear(); //frigiv hukommelse inden stage2 + aliasGenerator.clear(); shortHelper.clear(); - shortHelper = null; intHelper.clear(); - intHelper = null; //////////////////////////////////////////////////////////////////////////////////////// @@ -662,11 +679,11 @@ public Set getHusnumre(int gadeid) { - Map> gade = searchGadeidentAdresser.get(gadeid); + Map> gade = searchGadeidentAdresser.get(gadeid); Set set = new TreeSet( new NaturalOrderComparator() ); - for(Map litraList : gade.values()) { - for (Address a: litraList.values()) { + for(List
litraList : gade.values()) { + for (Address a: litraList) { set.add( a.husnr + a.husnrbogstav ); } } @@ -678,9 +695,16 @@ short husnr = Short.parseShort( husnrStr.replaceAll("[^\\d]","") ); String litra = husnrStr.replaceAll("\\d", ""); - Map> gade = searchGadeidentAdresser.get(gadeid); - Map litraList = gade.get(husnr); - return litraList.get(litra); + Map> gade = searchGadeidentAdresser.get(gadeid); + List
litraList = gade.get(husnr); + + for(Address addr : litraList) { + if (addr.husnrbogstav.equals(litra)) { + return addr; + } + } + + return null; }