2012-03-09 8 views
0

Я ищу способ определить, будет ли заказ (или, возможно, даже любой Итерабельный) заказываться по его контракту класса.Определение того, заказывается ли Java Iterable по контракту

Я уже знаю метод Guava: Ordering.natural().isOrdered(myCollection) Но этот метод не имеет отношения к моим потребностям, поскольку он проверяет, упорядочены ли значения внутри коллекции. Это не то, что мне нужно, чтобы определить, что я хочу, чтобы это isSorted метод, который будет вести себя так:

isSorted(new HashSet()) -> false 
isSorted(new ArrayList()) -> true 

и т.д ...

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

Знаете ли вы, что что-то подобное уже существует в какой-то библиотеке?

+7

'ArrayList' заказано, не отсортировано. –

+0

Как бы этот класс (или метод) знал, если он был заказан, не глядя ни на один. JavaDoc для этого класса 2. Исходный код этого класса (и его анализ) или 3. Уже есть карта значений, хранящихся как член (который не будет работать слишком хорошо с моей недавно определенной анонимной «Collection»)? –

+0

Да, я действительно имею в виду, что это «коллекция из класса, заказанного по контракту»? Если бы я должен был реализовать такой метод, я бы определенно собирал таблицу «доверенных» классов, упорядоченных по контракту, и возвращал true только для этих классов (и, конечно же, указывал точные методы, которые включены в ссылку таблица как контракт этого метода isOrdered) –

ответ

0

Вы можете сделать следующее, чтобы определить, будет ли сортировка определена для сортировки.

collection instanceof SortedSet 
+0

действительно, именно так я буду реализовывать такой метод, который я ищу, но мне было интересно, было ли это уже сделано, с полным списком типов для проверьте. –

0

Существует три интерфейса для упорядоченных коллекций: List, SortedSet и SortedMap. Вы можете проверить, реализует ли ваш класс один из них.

+0

Но есть также классы, которые реализуют Collection, не применяя ни один из этих трех интерфейсов, и которые упорядочены по контракту. Например, LinkedHashSet. –

0

Нет, это не существует ни в одной библиотеке, и не без оснований.

Эта библиотека должна будет знать все типы коллекций, которые летают. Если вы используете коллекцию Apache Commons, это должно было бы знать обо всех этих. Если вы используете Guava, он должен знать обо всех этих. Если кто-то приходит и вводит новый тип коллекции, вы теперь отказываетесь от этого типа, даже если его заказывают.

Не имеет смысла предоставлять этот метод в библиотеке, которая не может знать, какие библиотеки могут иметь другие типы коллекций.

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

Это могло бы помочь, если бы мы знали, что вы на самом деле пытаетесь сделать с этим методом.