Портрет участника бонусной программы (ранее: векторные часы)

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

Каждая операция участника бонусной программы регистрируется. При этом указывается номер категории и сумма операции.

Два портрета можно сравнить по степени лояльности. Сравнение имеет смысл только в том случае, когда они относятся к одной программе и имеют одинаковое количество категорий.

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

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

Решение должно содержать тестовую программу, которую вы разрабатываете самостоятельно.