Я видел более раннюю запись , которая пытается сделать что-то подобное в Python.
Вот пример того, что я хочу.Допустим, у меня есть Список.
public class MyObject {
private String purchase;
private Double price;
}
Допустим, что типичный List<MyObject>
будет содержать:
Bike 95.00
Clothes 24.99
Clothes 10.76
Food 6.35
Food 91.46
Я хочу, чтобы все предметы с одинаковой стоимостью покупки были объединеныв один предмет с ценой, суммируемой за этот предмет.Например, одежда - это один предмет с ценой 35,75 (если я правильно сделал сложение).
Я думал о том, как сделать это:
Collections.sort
список при покупке за O (n log n) - Пройдите по отсортированному списку (это
ArrayList
, который я использую), поскольку одни и те же элементы будут последовательно и выполнять слияние по 2 элементам одновременно O (n)
Общее время выполнения O (n log n).
Теперь это звучит разумно для меня, однако есть ли библиотека, которая по крайней мере бьет штаны?из моих констант?Я всегда поддерживаю переход на упрощенную версию, если она существует.Так есть ли какие-либо существующие реализации, о которых мне следует подумать об использовании или улучшении моего алгоритма?
РЕДАКТИРОВАТЬ
Подумав о моем сброшенном случае, когда я вчера возвращался домой,да, я легко увидел, что это карта.Все, что мне нужно было сделать, это свести ее к более простой проблеме, которую я написал, и это стало очень очевидным.Моя настоящая структура
public class MyObject {
Map bucketOfStuff;
}
На самом деле bucketOfStuff действительно Map<String, Object>
, где иногда значением является String, а иногда значением Double (иногда это также может быть Integer, но эй, я могу относиться кэто как двойной).Для всех объектов типа String они будут использоваться для формирования ключа в этой задаче.Итак, если бы у меня было
- color => Red
- size => Small
- texture => Smooth
Тогда я мог бы закодироватьвсе в одну строку, такую как Red,Small,Smooth
, потому что я знаю, что запятая не будет символом, присутствующим в любом из значений, поэтому я могу использовать его в качестве разделителя.
Для значения для нашей гипотетической новой карты этобыло бы List, потому что я должен выполнить (математическое) сложение вектора для всех значений bucketOfStuff
, которые являются двойными.Таким образом, предлагаемая новая карта будет либо Map<List<String>, List<Double>>
, либо просто Map<String, List<Double>>
, если я воспользуюсь разделителем, как указано выше.
Еще одна вещь, которая испортила мой мыслительный процесс, заключается в том, что в конце концов коллекция должна быть спискомпройти, чтобы я был в узком смысле, думая, список все время.Таким образом, я должен быть в состоянии восстановить оригинальный объект, который немного вовлечен, но не невозможен.Спасибо всем за помощь и хороший улов.
РЕДАКТИРОВАТЬ
Я должен немного изменить свое описание, потому что я только что напомнил, что я должен сохранить первоначальный порядок List<MyObject>
, поэтому мое первоначальное решение было бы неверным в любом случае, так как я делал это.По этой причине я буду продолжать следовать предложенной помощи и использовать LinkedHashMap<String, List<Double>>
.Исходя из Java 6 API"Этот связанный список определяет порядок итераций, который обычно является порядком, в котором ключи были вставлены в карту (порядок вставки)".