Накапливать количество списков в другом списке

Здесь я вижу две проблемы. Во-первых, tableGrob является функцией для создания grob из data.frame. Но вы уже создали свою таблицу, вам не нужна эта функция. Но ggtexttable возвращает объект ggplot, но вам нужен grob, поэтому вам нужно использовать ggplotGrob, чтобы превратить этот объект ggplot в то, что вы можете использовать с annotation_custom.

Вторая проблема заключается в том, диапазон, определенный для ваших значений x. Поскольку ваши данные отформатированы как вектор даты, эти значения сохраняются как количество дней с 1970-01-01, поэтому значения 1.5 и 1.8 находятся вне диапазона того, что вы на самом деле рисуете. Вы можете видеть свой фактический диапазон с помощью

range(as.numeric((HUC_df1$stdate)))
# [1] 11296 11298

. Таким образом, устраняя эти две проблемы, вы хотите, чтобы этот пример был

HUC1+annotation_custom(ggplotGrob(HUC1_table), xmin=11296, 
                                xmax=11298,
                                ymin=200, ymax=300)

8
задан Naman 19 January 2019 в 02:49
поделиться

3 ответа

Вы также можете попробовать:

listOfClassB.stream().map(ClassB::getAnotherObjList).flatMap(List::stream).count();

Это очень лаконично и элегантно. Если ClassB::getAnotherObjList не возвращает слишком много элементов, производительность не будет проблемой.

0
ответ дан fastcodejava 19 January 2019 в 02:49
поделиться
long totalSum = listOfClassB.stream()
     .mapToInt(elem -> elem.getAnotherObjList().size())
     .sum();

Я думаю, что результатом суммирования является long, так как несколько целых чисел могут пройти значение max int; вы всегда можете разыграть его, если уверены, что это не приведет к переполнению.

Это не совсем одна строка, по крайней мере, как отформатировано выше, но, возможно, он вписывается в одном выражении.

Если case и element в первом списке имеют значение null или если getAnotherObjList () возвращает значение null, вы можете поддержать это, отфильтровав эти случаи:

long totalSum = listOfClassB.stream()
     .filter(Objects::nonNull)
     .map(ClassB::getAnotherObjList)
     .filter(Objects::nonNull)
     .mapToInt(List::size)
     .sum();
0
ответ дан Naman 19 January 2019 в 02:49
поделиться

Другой способ с использованием коллекторов:

int totalNo = listOfClassB.stream()
    .collect(Collectors.summingInt(classB -> classB.getAnotherObjList().size()));

Эквивалентный способ, только со ссылками на метод:

int totalNo = listOfClassB.stream()
    .collect(Collectors.mapping(
             ClassB::getAnotherObjList, 
             Collectors.summingInt(List::size)));

Или отображение в потоке, а не в коллекторе:

int totalNo = listOfClassB.stream()
    .map(ClassB::getAnotherObjList)
    .collect(Collectors.summingInt(List::size));
0
ответ дан Federico Peralta Schaffner 19 January 2019 в 02:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: