2016-11-18 16 views
-1

У меня есть список, который выглядит следующим образом:вычислять средние значения нескольких значений в Java

40 4.8980713 
5 4.8012613 
5 4.8980713 
46 4.8980713 
5 4.8980713 
5 4.8945613 
40 4.0120713 
5 4.8980713 
5 4.8828129 
5 4.8000713 
40 4.8947213 
5 4.8980713 
46 4.8980713 
5 4.8828125 
46 4.8980713 

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

Я не уверен, как подойти к этому в Java, используя списки.

+0

Как бы вы сделать это на другом языке (или вручную с помощью ручки и бумаги)? – Seelenvirtuose

+0

это список из файла? – iambdot

+0

@Seelenvirtuose Loop через список массивов для каждой строки. Добавьте значения времени для каждого узла и создайте счетчик каждый раз, когда узел встречается, или создайте новый счетчик нового значения узла. Наконец, разделите сумму всего времени на счетчик для каждого узла. – Nir

ответ

2

Вы можете сначала прочитать файл CSV на List<String>. Затем разобрать его, разделив его на тройные пространства. Затем соберите его с Map<Integer, Double>, где ключи являются вашими узлами, а значения являются средними. Вы можете использовать averagingDouble от Collectors.

код будет выглядеть следующим образом:

List<String> lines = Files.readAllLines(Paths.get("/path/to/arrivals.csv")); 

Map<Integer, Double> averages = lines.stream() 
            .map(s -> s.split(" ")) 
            .collect(
             Collectors.groupingBy(
              r -> Integer.parseInt(r[0]), 
              Collectors.averagingDouble(v -> Double.parseDouble(v[1])) 
             ) 
            ); 

Если запустить это на вашем примере вы получите:

{5=4.872644944444445, 40=4.6016213, 46=4.8980713} 
+0

Спасибо! Итак, это то, что вы пытаетесь сделать: 1. чтение файла в поток 2. Разделение каждого потока на \ t 3. сбор отдельных значений узла вместе со временем (снова собранный со средним числом) – Nir

+1

Рад помочь. Это действительно то, что делает код. На самом деле это не _trying_, это действительно рабочий код; Я написал единичный тест, и вывод вашего примера также представлен в ответе. Обратите внимание, что \ t является вкладкой, пример в вопросе не использует вкладки, но использует 3 пробела. –

+0

Еще раз спасибо за разъяснение. Я не мог бы придумать этот сжатый код так быстро. Сегодня я узнал что-то новое. – Nir

Смежные вопросы