Среднее значение на основе отдельного идентификатора по Java Stream - PullRequest
0 голосов
/ 16 февраля 2019

У меня есть класс с именем Tag.

public class Tag {
    String tag_id;
    int x_pos;
    int y_pos;
    int z_pos;
    public String getTag_id() {
        return tag_id;
    }
    public void setTag_id(String tag_id) {
        this.tag_id = tag_id;
    }
    public int getX_pos() {
        return x_pos;
    }
    public void setX_pos(int x_pos) {
        this.x_pos = x_pos;
    }
    public int getY_pos() {
        return y_pos;
    }
    public void setY_pos(int y_pos) {
        this.y_pos = y_pos;
    }
    public int getZ_pos() {
        return z_pos;
    }
    public void setZ_pos(int z_pos) {
        this.z_pos = z_pos;
    }

    public String toString()
    {
        return this.tag_id +" "+this.x_pos+" "+this.y_pos+" "+this.z_pos;
    }


}

Теперь у меня есть список массивов Tag.

ArrayList<Tag> tag_info = new ArrayList<>();

Идентификатор тега может быть A, B, C или любым другим.Это динамично, а не исправлено.Мне нужно получить среднее значение x_pos, y_pos и z_pos из tag_info.Размер списка массивов также является динамическим, может варьироваться от 60 до 70.Я написал все это с использованием циклов, но хотел преобразовать его с помощью Stream.

Я извлек уникальные идентификаторы, используя:

Stream<Tag> a = tag_info.stream().filter(distinctByKey(Tag::getTag_id));

Но теперь я не хочу запускать цикл поверхвсе значение и получить среднее.Что-нибудь попроще?

Ответы [ 2 ]

0 голосов
/ 17 февраля 2019

Возможно, общее кэширование может помочь избежать пересчета всех значений, например:

  • Новый класс TagsList с long total_x, long total_y, long total_z
  • притег добавляется, удаляется из TagsList, затем итоговое значение изменяется соответствующим образом
  • Тег может быть изменен для принятия ChangeEventListener (который представляет собой TagsList), при изменении pos_x, pos_y или pos_z слушатели информируются об этом, поэтому TagsList может обновитьего общие значения
  • getAverage_Pos_x - это всего лишь total_x / numberOfTags
0 голосов
/ 16 февраля 2019

Используйте Collectors::averagingDouble

    Double xAvg = tag_info.stream()
            .collect(Collectors.averagingDouble(Tag::getX_pos));
    Double yAvg = tag_info.stream()
            .collect(Collectors.averagingDouble(Tag::getY_pos));
    Double zAvg = tag_info.stream()
            .collect(Collectors.averagingDouble(Tag::getZ_pos));

Также, если вы хотите получить средние значения по каждому tag_id используйте groupingBy:

    Map<String, Double> map = tags.stream()
            .collect(groupingBy(Tag::getTag_id,
                    averagingDouble(Tag::getX_pos)));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...