У меня есть список объектов, которые я должен отсортировать на поле, сказать Счет. Не много думая я записал новый класс, который реализует Компаратор, который делает задачу, и это работает.
Теперь оглядываясь назад на это, я задаюсь вопросом, должен ли я иметь, вместо этого имеют мою реализацию класса, Сопоставимую вместо того, чтобы создать новый класс, который реализует Компаратор. Счет является единственным полем, на котором будут заказаны объекты.
Что я сделал приемлемый как практика?
Правильный подход, "Сначала имеют Сопоставимую реализацию класса (для естественного упорядочивания) и если альтернативное полевое сравнение требуется, то создайте новый класс, который реализует Компаратор"?
Если (2) выше верно, то это означает, что нужно реализовать Компаратор только после того, как у них есть Сопоставимая реализация класса? (Принятие я владею исходным классом).
Я бы сказал, что объект должен реализовать Comparable, если это очевидный естественный способ сортировки класса, и любой, кому понадобится сортировать класс, обычно захочет сделать это таким образом.
Если же сортировка является необычным использованием класса, или сортировка имеет смысл только для конкретного случая использования, то лучшим вариантом будет Comparator.
Другими словами, учитывая название класса, ясно ли, как будет сортировать компаратор, или вам придется прибегнуть к чтению javadoc? Если это последнее, то, скорее всего, каждый будущий случай сортировки потребует использования компаратора, и тогда реализация comparable может замедлить работу пользователей класса, а не ускорить ее.
Используйте Сопоставимый
:
Используйте Компаратор
:
Сопоставимый
. Comparable
) поведения. Я бы сказал:
Как сказал Матье в другом ответе, библиотека Boost.MultiIndex кажется правильным выбором для того, что вы хотите. Однако эту библиотеку может быть немного трудно использовать в начале, особенно если у вас нет большого опыта работы с C++. Вот как вы могли бы использовать библиотеку для решения точной проблемы в коде вашего вопроса:
struct person {
std::string name;
int id;
person(std::string const & name, int id)
: name(name), id(id) {
}
};
int main() {
using namespace::boost::multi_index;
using namespace std;
// define a multi_index_container with a list-like index and an ordered index
typedef multi_index_container<
person, // The type of the elements stored
indexed_by< // The indices that our container will support
sequenced<>, // list-like index
ordered_unique<member<person, string,
&person::name> > // map-like index (sorted by name)
>
> person_container;
// Create our container and add some people
person_container persons;
persons.push_back(person("B", 123));
persons.push_back(person("C", 224));
persons.push_back(person("A", 321));
// Typedefs for the sequence index and the ordered index
enum { Seq, Ord };
typedef person_container::nth_index<Seq>::type persons_seq_index;
typedef person_container::nth_index<Ord>::type persons_ord_index;
// Let's test the sequence index
persons_seq_index & seq_index = persons.get<Seq>();
for(persons_seq_index::iterator it = seq_index.begin(),
e = seq_index.end(); it != e; ++it)
cout << it->name << ":"<< it->id << endl;
cout << "\n";
// And now the ordered index
persons_ord_index & ord_index = persons.get<Ord>();
for(persons_ord_index::iterator it = ord_index.begin(),
e = ord_index.end(); it != e; ++it)
cout << it->name << ":"<< it->id << endl;
cout << "\n";
// Thanks to the ordered index we have fast lookup by name:
std::cout << "The id of B is: " << ord_index.find("B")->id << "\n";
}
Что приводит к следующим выводам:
B:123
C:224
A:321
A:321
B:123
C:224
The id of B is: 123
-121--1547481- Я бы использовал столбец IDENTITY, а если нет, то использовать System.Guid.NewGuid () для создания GUID для вас.
-121--3430372-Здесь был аналогичный вопрос: Когда класс должен быть Comparable и / или Comparator?
Я бы сказал следующее: Реализуйте Comparable для чего-то вроде естественного упорядочения, например на основе внутреннего идентификатора
. Реализуйте компаратор, если у вас есть более сложный алгоритм сравнения, например несколько полей и так далее.
Используйте Comparable
, если вы хотите определить стандартное (естественное) поведение упорядочивания рассматриваемого объекта, распространенной практикой является использование для этого технического или естественного (база данных?) идентификатора объекта.
Используйте Компаратор
, если вы хотите определить внешнее управляемое поведение упорядочивания, это может переопределить поведение упорядочивания по умолчанию.