CONDURURENDKIPLISTMAP сортировка: Может ли это сделать по сравнению со значением?

StackOverflow https://stackoverflow.com/questions/3762496

  •  04-10-2019
  •  | 
  •  

Вопрос

В игре я пытаюсь сохранить список пользователей и сортировать его по оценке, чтобы я мог запрашивать список в любое время и возвращать (например) десять лучших пользователей по оценке. Этот список должен быть в потоке. Я предусматриваю, используя строку имени пользователя в качестве ключа, и значение будет пользовательским объектом, который реализует сопоставимым и имеет такие свойства, как DisplayName и оценка. Поэтому пользовательский объект будет иметь метод сравнения, который будет сравнивать атрибут баллов для определения его позиции.

Я смотрю на использование CONCURURENDKIPLISTMAP для этого, но как можно лучше сказать, карта (в отличие от набора) использует ключ для сортировки. Я хотел бы, чтобы список отсортировал со свойством оценки объекта пользователя, но все же использовать карту, потому что мне нужно иметь возможность получить доступ к любому данному пользователю и изменить свой атрибут балла из потока.

Не похоже, что использование моего собственного компаратора для ключа решит мою проблему, так как я сомневаюсь, что у меня будет доступ к соответствующему значению для сравнения. Я мог бы использовать ConcurrencekiPLiSsetet, но доступ к списку для изменения оценки индивидуального пользователя (я бы представлял) дорогостоящую операцию (из-за необходимости повторять каждый раз).

Кто-нибудь сможет предложить, как это достичь этого?

Это было полезно?

Решение

Нет, я не думаю, что вы можете. Компаратор, используемый для заказа, одинаково используется для индексации. Возможно, вам придется поддерживать 2 коллекции. Один для хранения заказа пользователей оценивает то, что касается пользователей по имени.

Другие советы

get(key) Зависит от компаратора (чтобы иметь возможность найти ключ). Вы предлагаете компаратор, который будет зависеть от get(key) (Чтобы получить доступ к сопоставленному значению ключа сравнить на основе этого). Что обязательно приводит к бесконечности рекурсии и переполнение стека (На светлой стороне вы публикуете на правильном веб-сайте !!)

Майкл прав, вы не можете иметь твоего торта и есть его тоже;)

Я думаю, у вас есть 3 варианта:

  1. Используйте карту, так что обновления на счет пользователя быстрые, и вы платите цену при сортировке, чтобы найти самые высокие оценки.
  2. Используйте сортировку, которая сортирует по оценке, чтобы найти высочайшие оценки быстро, но вы должны оплатить цену при обновлении баллов пользователя
  3. Сохраняйте две структуры данных, чтобы вы могли иметь лучшее из 1 и 2. Например, у вас есть свои реальные данные в наборе, отсортированном по оценке, но затем также поддерживать отображение имени пользователя, чтобы индексировать набор или аналогичный. Таким образом, у вас всегда есть сортированные баллы, и обновление баллов пользователя - это просто поиск, а не поиск. Цена, которую вы платите за это сейчас, вы поддерживаете некоторую дублирующую информацию в двух местах, и особенно учитывая одновременный доступ, это может быть сложно, чтобы обои места всегда были обновлены в синхронизации.

Я бы не сделал предположения о том, что быстрее между 1 и 2. Я бы попробовал их с ожидаемым использованием и измерением, чтобы увидеть, что худшее.

Если вы действительно заинтересованы только в топ-н-баллах, то есть возможность просто сохранить этот список отдельно. Итак, у вас есть карта имени пользователя, чтобы забить для всех, но и поддерживать небольшой набор лучших баллов (и их пользователей). Каждый раз, когда вы добавляете / обновите чью-то оценку, просто проверьте счет по сравнению с главным списком балла, и если он больше, чем самая маленькая, просто добавьте его и ударили нижний. Это похоже на предложение 3 выше, но меньше накладных и, возможно, легче поддерживать.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top