Search code examples
javastringdictionarycoordinatescoordinate-systems

Java String from Map of X-Y Coordinates


I have a Map where Coords is defined as so:

class Coords {
        int x;
        int y;
        public boolean equals(Object o) {
            Coords c = (Coords)o;
            return c.x==x && c.y==y;
        }
        public Coords(int x, int y) {
            super();
            this.x = x;
            this.y = y;
        }
        public int hashCode() {
            return new Integer(x+"0"+y);
        }
    }

(not very good, I know, please don't tease me.) How can I now create a String where the characters are mapped from this map, for example:

Map<Coords, Character> map = new HashMap<Coords, Character>();
map.put(new Coords(0,0),'H');
map.put(new Coords(1,0),'e');
map.put(new Coords(2,0),'l');
map.put(new Coords(3,0),'l');
map.put(new Coords(4,0),'o');
map.put(new Coords(6,0),'!');
map put(new Coords(6,1),'!');
somehowTransformToString(map); //Hello !
                               //      !

Thanks,
Isaac Waller
(note - it's not homework)


Solution

    1. Create a comparator which can sort Coords by y and then x:

      int d = c1.y - c2.y;
      if (d == 0) d = c1.x - c2.y;
      return d;
      
    2. Create a sorted map:

      TreeMap<Coords, Character> sortedMap = new TreeMap(comparator);
      sortedMap.putAll(map); // copy values from other map
      
    3. Print the values of the map in order:

      for (Character c: map.values()) System.out.print(c);
      
    4. If you need newlines:

      int y = -1;
      for (Map.Entry<Coords, Character> e: map.entrySet()) {
          if (e.y != y) {
              if (y != -1) System.out.println();
              y = e.y;
          }
          System.out.print(c);
      }