Java: чтение данных из очереди и преобразование в желаемый вывод - PullRequest
0 голосов
/ 22 января 2020

У меня есть очередь A фиксированного размера, которая содержит объект Customer. Размер очереди - 1000.

public class Customer {
private final String accountId;
private Double value = null;

private Customer(final String accountId, Double value) {
        this.accountId = accountId;
        this.value= value;
    }
}

Работают два потока. Основной поток помещает этот объект Customer в очередь A, и существует другой поток, который опрашивает объект customer из очереди.

Второй поток должен обработать эти объекты клиентов в карте hashmap, где ключ является accountId и value - это объект записи, который.

public class Record {
   List<Double> values;
   List<Double> count;
}

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

Например:

Очередь A содержит следующий объект клиента

{"111", 8.0}
{"111", 8.0}
{"111", 9.0}
{"111", 9.0}
{"111", 9.0}
{"111", 10.0}
{"222", 2.0}
{"222", 3.0}
{"222", 3.0}

Ожидаемый результат:

{"111", Record {[8.0, 9.0, 10.0], [2.0, 3.0, 1.0]}}
{"222" Record {[2.0, 3.0], [1.0, 2.0]}

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

1 Ответ

0 голосов
/ 22 января 2020

Сначала измените свою логику c, чтобы сохранить счет при обработке значений. Во-вторых, измените тип объекта значений на Set, чтобы вы никогда не сохраняли больше значений, чем вам нужно. Set позаботится об уникальности.

Так что держите объект, который отслеживает ваши данные:

public class TrackingData {
   String customerId
   Set<Double> values;
   int count;
}

Держите карту вокруг них: Hashmap trackingRecords = new HashMap <>; И ваша логика обработки c становится примерно такой (псевдокод):

synchronized(customerId) {
   TrackingData customerRecord = trackingRecords.get(customerId);
   customerRecord.values.add(value);
   customerRecord.count++;
}

Возможно, вам сейчас не нужно синхронизировать логи c, но если вы когда-либо выполняете эту обработку (что является обычным чтением) из очередей) он тебе понадобится.

Если вам нужно сохранить все уникальные значения в памяти, вы в конечном итоге столкнетесь с проблемами

...