2012-05-09 4 views
0

Я знаю, что TreeSet хранит объекты отсортированным образом. Но есть ли способ настроить заказ?Изменение порядка элементов TreeSet для настраиваемого вывода

Например, если у меня есть TreeSet:

TreeSet t1 = new TreeSet(); 
    t1.add("c"); 
    t1.add("d"); 
    t1.add("a"); 

И теперь, если я итерацию по ним>

Iterator it1 =t1.iterator(); 

    while(it1.hasNext()){ 
     Object o1 = it1.next(); 
     System.out.println(o1); 
    } 

я всегда получите заказ, как: a>c>d, однако я хочу, чтобы вернуться порядок тот же, что и я добавил в него элементы, т.е. c>d>a?

ответ

2

Поскольку вы упоминаете о том, обязаны использовать TreeSet, что-то вроде этого приходит мне на ум:

Set<String> result = new TreeSet<String>(new Comparator<String>(){ 
    @Override 
    public int compare(String arg0, String arg1) { 
     return returnCode(arg0).compareTo(returnCode(arg1)); 
    } 
}); 

где:

private Integer returnCode(String p){ 
     int code = 0; 
     String id = p.toLowerCase(); 
     if ("a".equalsIgnoreCase(id)) code = 3; 
     else if ("b".equalsIgnoreCase(id)) code = 2; 
     else if ("c".equalsIgnoreCase(id)) code = 1; 
     //etc 
     return new Integer(code); 
} 

Так в основном вы реализуете свой собственный компаратор, который является ничем иным, назначая определенные целочисленные значения вставленной строки (который я предполагаю, что вы уже знаете).

ПРИМЕЧАНИЕ. Это решение не будет работать, если вы не поймаете опцию в методе returnCode(). Я предполагаю, что вы уже знаете данные, которые подаются в TreeSet.

+0

привет, да, это то, что я сделал в моем случае. – 911TurboS

6

Использование LinkedHashSet для него,

TreeSet сортирует элемент, и для струны сортирует на основе естественного порядка (это то, как реализуется его компаратор), если вы хотите, чтобы управлять порядком вставки, то вам нужно пользователю LinkedHashSet

и если вам не нужна uniquness (функция множества), а затем пойти на List

+0

но если я реализовать собственный компаратор и переопределить оригинал, я думаю, что он будет работать. Не видели LinkedHashSet, позвольте мне проверить, спасибо за ответ. – 911TurboS

+0

'LinkedHashSet' специально разработан для этой цели и будет быстрее. Кроме того, вид «компаратора», который вам нужен для отслеживания порядка вставки, должен быть сдержанным, что не является хорошей идеей для чего-то, что только должно быть функтором. Пойдите с 'LinkedHashSet', @Jigar прав. –

+0

@sparc_spread, спасибо, что treeSet уже есть часть библиотеки. И теперь, если я поеду на LInkedHashSet, мне придется изменить внешнюю библиотеку в целом :(но я попробую, спасибо – 911TurboS

1

Это намного проще:

TreeSet treeSetObj = new TreeSet(Collections.reverseOrder()); 
Смежные вопросы