2014-12-19 2 views
0

У меня есть java Set, и я не могу изменить его на TreeSet, хотя я мог бы его скопировать. Вот вопрос:Java Set - как сортировать по перечню имен

У меня есть имена, башня, автомобиль, здание, офис, подвал. У меня есть POJO, у которого есть переменная метки строки, содержащая один из них для каждого экземпляра.

как я могу сортировать их, чтобы быть ТОЧНЫМ порядком башни, автомобиля, здания, офиса, подвала. Разумеется, не будет дубликатов (его набор).

public class Places{ 

String label; 
int moreinfo; 
} 

так представить, у меня есть 10 мест объектов с метками, которые могут быть любыми из башни, автомобиля, здания, офиса, подвал: как я могу сортировать их в наборе, чтобы гарантировать, что они находятся в точном порядке " башня, автомобиль, здание, офис, подвал "?

+1

Изменить 'Места' для реализации' Сопоставимый '. –

ответ

0

Вы можете использовать карту, чтобы определить порядок для произвольного набора строк:

private static Map<String, Integer> ordering; 
static { 
    ordering = new HashMap<>(); 
    ordering.add("tower", 1); 
    ordering.add("car", 2"); 
    ...add your other strings with increasing values... 
} 

Collections.sort(yourCollection, new Comparator<Places>() { 
    public int compare(Places p1, Places p2) { 
     return ordering.get(p1.label) - ordering.get(p2.label); 
    } 
}); 

Будьте осторожны, однако ... Вы не можете сортировать Set. Если это SortedSet (например, TreeSet), он будет сортировать себя, если он не имеет определенного порядка.

+0

PS Естественно, если вы используете Java 8, вы можете использовать лямбда для создания компаратора –

+0

Спасибо @JeffreyBosboom, исправлено. –

1

Вы можете поместить поле 'label' в перечисление, в котором значения перечисления упорядочены по вашему индивидуальному заказу.

public enum Label { 
    TOWER, CAR, BUILDING, OFFICE, BASEMENT 
} 

Затем вы можете реализовать сопоставимые для сортировки множества.

class Places implements Comparable<Places>{ 

    Label label; 
    int moreinfo; 
    @Override 
    public int compareTo(Places o) { 
     return label.compareTo(o.label); 
    } 
} 

Затем вы можете использовать метод Collections.sort для сортировки.

+0

творческий ответ, но я не могу изменить свою реализацию. Ярлык - это строка в моем коде. Плюс один. – j2emanue

Смежные вопросы