2009-05-25 10 views
1

У меня есть карта, где Coords определяется как так:Java Строка из Карта XY Координаты

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); 
     } 
    } 

(. Не очень хорошо, я знаю, пожалуйста, не дразните меня) Как я могу теперь создать Строка, где символы отображаются с этой карты, например:

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 ! 
           //  ! 

Спасибо,
Isaac Waller
(обратите внимание - это не домашнее задание)

+0

Какой у вас выход? Консоль STD? –

+0

Фактически, текстовое поле управления. –

+0

(EditText на Android) –

ответ

6
  1. Создать компаратор, который может сортировать COORDS через у, а затем х:

    int d = c1.y - c2.y; 
    if (d == 0) d = c1.x - c2.y; 
    return d; 
    
  2. Создать отсортированный карту:

    TreeMap<Coords, Character> sortedMap = new TreeMap(comparator); 
    sortedMap.putAll(map); // copy values from other map 
    
  3. Печать значений карты в порядке:

    for (Character c: map.values()) System.out.print(c); 
    
  4. Если вам нужны символы перевода строки:

    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); 
    } 
    
+0

Это работает для X, но тогда Y игнорируется. –

+0

Это не addAll, это putAll –

+0

putAll(): Исправлено. Компаратор сначала сортируется по Y. Если Y одинаково для двух символов, они будут отсортированы по X. Поэтому я не уверен, что вы подразумеваете под «Это работает для X». –

1

Я предлагаю вам добавить метод ToString в Корд или использовать класс точки.

Map<Point, Character> map = new HashMap<Point , Character>(); 
map.put(new Point(0,0),'H'); 
map.put(new Point(1,0),'e'); 
map.put(new Point(2,0),'l'); 
map.put(new Point(3,0),'l'); 
map.put(new Point(4,0),'o'); 
map.put(new Point(6,0),'!'); 
map put(new Point(6,1),'!'); 
String text = map.toString(); 

Если вы хотите разместить символы, вы можете использовать многомерный массив.

char[][] grid = new char[7][2]; 
grid[0][0] ='H'; 
grid[0][1] ='e'; 
grid[0][2] ='l'; 
grid[0][3] ='l'; 
grid[0][4] ='o'; 
grid[0][6] ='!'; 
grid[1][6] ='!'; 
for(char[] line: grid) System.out.println(new String(line));