2016-07-21 3 views
0

У меня есть следующие карты, с Range<Integer> является ключевым:Как сортировать коллекцию, которая использует значения диапазона Guava как ключи?

| Range<Integer> | Set<Range<BigDecimal>> 
------------------------------------------------------------ 
| 1..100   | [0.01..1.00], [2.01..15.00], [1.01..2.00] 
------------------------------------------------------------ 
| 151..250  | [0.01..1.00], [2.01..15.00], [1.01..2.00] 
------------------------------------------------------------ 
| 101..150  | [1.01..7.00], [0.01..1.00] 
------------------------------------------------------------ 

У меня также есть следующие реализации компаратора:

public class RangeComparator<T extends Comparable<T>> implements Comparator<Range<T>> { 

    @Override 
    public int compare(Range<T> first, Range<T> second) { 
     int comparatorResult = first.lowerEndpoint().compareTo(second.lowerEndpoint()); 
     return comparatorResult == 0 ? first.upperEndpoint().compareTo(second.upperEndpoint()) : comparatorResult; 
    } 
} 

Я хотел бы отсортировать значения в карте, используя этот компаратор , а затем отсортировать саму карту, таким образом, получить следующий результат:

| Range<Integer> | Set<Range<BigDecimal>> 
------------------------------------------------------------ 
| 1..100   | [0.01..1.00], [1.01..2.00], [2.01..15.00] 
------------------------------------------------------------ 
| 101..150  | [0.01..1.00], [1.01..7.00] 
------------------------------------------------------------ 
| 151..250  | [0.01..1.00], [1.01..2.00], [2.01..15.00] 
------------------------------------------------------------ 

класс гуавы Range является окончательным и не implemen t Сопоставимо.

Могу ли я сортировать это, не выполняя сортировку вручную? Если да, то как?

+2

'TreeSet' и' TreeMap' имеют конструкторы, которые принимают явный 'Comparator'. Что мешает вам это использовать? –

+0

Почему вы не можете использовать TreeMap или TreeSet? – immibis

+0

@AndyTurner Ваш ответ был прав, пожалуйста, разместите его еще раз. Несвязанный поставщик TreeSet, который использовал конструктор по умолчанию, выбрал ClassCastException, и я приписал это сортировке карты, которую я пытался сделать. Пользовательский компаратор работает нормально. –

ответ

2

Используйте конструкторы TreeMap и TreeSet, которые принимают Comparator в качестве параметра, например.

public TreeMap(Comparator<? super K> comparator) 

Создаст новую, пустую карту дерева, упорядоченную в соответствии с данным компаратором.

Обратите внимание, что не существует каких-либо ограничений, что ключи от TreeMap или записей в TreeSet необходимо реализовать Comparable.

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