-3

I am trying to sort a hashmap containing an object and a double value but it's not working as expected. Here is my code.

HashMap<Route, Double> unsortedRoutes = new HashMap<>();

unsortedRoutes.add(new Route("Route Z"),9.49307305463114167);
unsortedRoutes.add(new Route("Route A"),9.546311415463114167);
unsortedRoutes.add(new Route("Route K"),9.37307305463114167);
unsortedRoutes.add(new Route("Route Y"),9.89730305463114167);
unsortedRoutes.add(new Route("Route Z"),3.49307305463114167);
unsortedRoutes.add(new Route("Route A"),3.41870305463114167);
unsortedRoutes.add(new Route("Route K"),4.49307305463114167);
unsortedRoutes.add(new Route("Route Y"),5.34307305463114167);

HashMap<Route, Double> sortedRoutes = new HashMap<>();
        unsortedRoutes.entrySet()
                .stream()
                .sorted(comparingByValue())
                .forEachOrdered(x -> sortedRoutes.put(x.getKey(), x.getValue()));

When I ran the code these are the results I get

Name: Route D Distance = 3.4187030546311417
Name: Route J Distance = 5.343073054631142
Name: Route A Distance = 9.546311415463114
Name: Route Y Distance = 9.897303054631141
Name: Route U Distance = 4.493073054631141
Name: Route K Distance = 9.373073054631142
Name: Route Z Distance = 9.493073054631141
Name: Route Q Distance = 3.4930730546311417

I expected the results to be listed in ascending order.

Some Body
  • 13
  • 5

1 Answers1

3

HashMaps make no guarantee on the order of elements stored in them, so even if you call put in a sorted fashion, the resulting HashMap will have no intrinsic order. If you want to preserve the order that put was called in, you should use a LinkedHashMap:

Map<Route, Double> sortedRoutes = new LinkedHashMap<>();
Mureinik
  • 297,002
  • 52
  • 306
  • 350
  • 1
    @Nikolas you experienced a downvote of your upvote? IMHO this answer is fine, just altering the implementing map class. – Joop Eggen Sep 19 '18 at 12:29