Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Группировка массива / 19 сообщений из 19, страница 1 из 1
13.07.2020, 20:31
    #39979222
Shitbox2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Группировка массива
Всем привет! Кто-нибудь может переписать эту функцию на Си? Мне кажется для любого специалиста написать такое на своём языке это 5 минут труда или я ошибаюсь?)

Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
/**
 * Group items by field
 *
 * items =
 *   [{id: 1, name: 'A', i: 1}, {id: 2, name: 'B', i: 2}, {id: 3, name: 'A', i: 3}, {id: 4, name: 'B', i: 4}, {id: 5, name: 'A', i: 5}]
 *
 * groupByField(items, 'name', ['i']) =
 *   [
 *     {
 *       groupField: 'name',
 *       groupValue: 'A',
 *       items: [{id: 1, name: 'A', i: 1}, {id: 3, name: 'A', i: 3}, {id: 5, name: 'A', i: 5}],
 *       id: 1, //First value
 *       i: 9   //Summed value
 *     }, {
 *       groupField: 'name',
 *       groupValue: 'B',
 *       items: [{id: 2, name: 'B', i: 2}, {id: 4, name: 'B', i: 4}],
 *       id: 2,
 *       i: 6
 *     }
 *   ]
 *
 * @param items - Array<any> - items array
 * @param field - string - field name
 * @param sumFields - Array<string> - array with names of fields which should be summed
 * @returns Array<any>
 */
function groupByField(items, field, sumFields = []) {
  const itemsByField = new Map() // We need correct order of items
  const sumReducer = (fieldName) => (prev, next) => (prev + next[fieldName] || 0);
  const result = [];
 
  for (let i = 0; i < items.length; i++) {
    const item = items[i];
    const groupKey = item[field];
    const groupedCollection = itemsByField.get(groupKey) || [];
 
    if (!groupedCollection.length) {
      itemsByField.set(groupKey, groupedCollection);
    }
 
    groupedCollection.push(item);
  }
 
  for (const entry of itemsByField) {
    const key = entry[0];
    const items = entry[1];
    const aggregatedItem = { ...items[0] }; // Copy first item
 
    // Calculate values which should be summed
    for (let j = 0; j < sumFields.length; j++) {
      const fieldName = sumFields[j];
 
      aggregatedItem[fieldName] = items.reduce(sumReducer(fieldName), 0)
    }
 
    aggregatedItem.groupField = field;
    aggregatedItem.groupValue = key;
    aggregatedItem.items = items;
 
    result.push(aggregatedItem);
  }
 
  return result;
}
...
Рейтинг: 0 / 0
13.07.2020, 21:14
    #39979233
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Группировка массива
Shitbox2
Мне кажется для любого специалиста написать такое на своём языке это 5 минут труда или я ошибаюсь?)

Не ошибаешься, но зачем тратить даже 5 минут на нудную хрень?
...
Рейтинг: 0 / 0
13.07.2020, 22:07
    #39979245
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Группировка массива
Shitbox2Мне кажется для любого специалиста написать такое на своём языке это 5 минут труда или я
ошибаюсь?)

Ошибаешься. Но поддерживаю предыдущего оратора.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
13.07.2020, 22:17
    #39979247
Shitbox2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Группировка массива
Dima T
Не ошибаешься, но зачем тратить даже 5 минут на нудную хрень?

Dimitry Sibiryakov
Ошибаешься. Но поддерживаю предыдущего оратора.


Для кого это 5 мин, потратьте их, пожалуйста, сэкономьте мне пол дня гугления нужных методов. Будете JS изучать, я вам потом время сэкономлю :-) Тут нет задачи просто написать, чтобы работало - примерно представляю, как это должно быть. Интересует как это напишут люди, которые не первый год работают с языком.
...
Рейтинг: 0 / 0
14.07.2020, 06:27
    #39979274
CEMb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Группировка массива
Shitbox2
Будете JS изучать, я вам потом время сэкономлю :-)
JS изучать
Shitbox2
Кто-нибудь может переписать эту функцию на Си?
на Си нет, не смогу
...
Рейтинг: 0 / 0
14.07.2020, 09:13
    #39979292
rdb_dev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Группировка массива
Shitbox2
Для кого это 5 мин, потратьте их, пожалуйста, сэкономьте мне пол дня гугления нужных методов. Будете JS изучать, я вам потом время сэкономлю :-) Тут нет задачи просто написать, чтобы работало - примерно представляю, как это должно быть. Интересует как это напишут люди, которые не первый год работают с языком.
Для тех, кто владеет С++, тем JavaScript - лёгкое чтиво перед сном. На Си это выльется в килобайты исходного кода и даже на С++ в 5 минут не уложиться... И у нас нет стимула!
...
Рейтинг: 0 / 0
14.07.2020, 11:35
    #39979363
Shitbox2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Группировка массива
CEMb
на Си нет, не смогу

На Си++. Топик по Си++, думал, что поймут правильно

rdb_dev
Для тех, кто владеет С++, тем JavaScript - лёгкое чтиво перед сном. На Си это выльется в килобайты исходного кода и даже на С++ в 5 минут не уложиться... И у нас нет стимула!

Серьезно? Никто на Си++ никогда не работал с динамическими массивами и не создавал объекты с переменным количеством полей. Это настолько редкие задачи, что за почти 40 лет никаких библиотек не появилось? Я плохо знаю Си++, только основы, но могу с уверенностью сказать, что человек, проработавший с ним хотя бы три года напишет такое если не за 5, то за 10 минут точно. Это не настолько отсталый язык.

И какой стимул у людей на JS-форуме по аналогичным вопросам https://javascript.ru/forum/css-html/80309-pomogite-perevesti-kod-s-s-na-js.html
Просто берут и помогают
...
Рейтинг: 0 / 0
14.07.2020, 11:59
    #39979375
rdb_dev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Группировка массива
Shitbox2
Серьезно? Никто на Си++ никогда не работал с динамическими массивами и не создавал объекты с переменным количеством полей?
...
Я плохо знаю Си++, только основы, но могу с уверенностью сказать...
Ты ничего не можешь с уверенностью сказать, потому что не знаешь даже основ С++.

Чтобы использовать переменное кол-во полей, структура не подойдёт и именованные поля как бы структуры придётся представить в виде ассоциативного массива по имени элемента массива (как бы поля структуры) к какому-то контейнеру, способному оперировать любым типом данных, а затем уже этот массив пихать в массив items.

Лично мне это нафиг не упёрлось!
...
Рейтинг: 0 / 0
14.07.2020, 12:36
    #39979396
CEMb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Группировка массива
Shitbox2
На Си++.

могу, минут 15-30. Я же правильно понял, что эта функция разбирает входящий массив по значению заданного поля, а потом суммирует значения из получившейся мультимапы по ключу?
...
Рейтинг: 0 / 0
14.07.2020, 12:56
    #39979416
petrav
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Группировка массива
rdb_dev

Чтобы использовать переменное кол-во полей, структура не подойдёт и именованные поля как бы структуры придётся представить в виде ассоциативного массива по имени элемента массива (как бы поля структуры) к какому-то контейнеру, способному оперировать любым типом данных, а затем уже этот массив пихать в массив items.

В JavaScript "структура" -- это собственно и есть ассоциативный массив.
...
Рейтинг: 0 / 0
14.07.2020, 12:57
    #39979418
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Группировка массива
Shitbox2Это настолько редкие задачи, что за почти 40 лет никаких библиотек не появилось?

Да. Это исчезающе редкие задачи.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
14.07.2020, 13:13
    #39979428
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Группировка массива
Shitbox2,

Этот код немного не то делает, но я и не нанимался делать лабы студентам.
А подсмотреть как можно в С++ работать с такими структурами данных вполне можно на этом примере.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
#include <algorithm>
#include <deque>
#include <map>
#include <string>
#include <variant>

using Value = std::variant<std::string, int>;
using Item = std::map<std::string, Value>;
using Items = std::deque<Item>;

Items group_by(Items items, std::string group_field, std::deque<std::string> sum_fields)
{
    Items rv;
    std::deque<Item*> sorted_items;
    for (auto& i: items) {
        sorted_items.push_back(&i);
    }
    std::sort(sorted_items.begin(), sorted_items.end(),
              [&group_field](Item* a, Item* b){ return (*a)[group_field] < (*b)[group_field];});

    Item acc;
    bool has_data = false;
    for (auto pi: sorted_items) {
        auto& i = *pi;
        if (has_data && acc[group_field] != i[group_field]) {
            rv.push_back(acc);
            acc = {};
        }

        acc[group_field] = i[group_field];
        for (auto& sf: sum_fields) {
            if (acc.find(sf) != acc.end())
                acc[sf] = std::get<int>(acc[sf]) + std::get<int>(i[sf]);
            else
                acc[sf] = std::get<int>(i[sf]);
        }
        has_data = true;
    }
    if (has_data) {
        rv.push_back(acc);
    }
    return rv;
}

int main()
{
    Items items = {
        { { "key", "a" }, {"val", 1} },
        { { "key", "c" }, {"val", 2} },
        { { "key", "b" }, {"val", 3} },
        { { "key", "a" }, {"val", 4} },
        { { "key", "b" }, {"val", 5} },
    };
    auto groupped = group_by(items, "key", {"val"});
    for (auto& i: groupped) {
        LOG_TRACE(std::get<string>(i["key"]) << ": " << std::get<int>(i["val"]));
    }
    return 0;
}
...
Рейтинг: 0 / 0
14.07.2020, 13:31
    #39979446
rdb_dev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Группировка массива
petrav
В JavaScript "структура" -- это собственно и есть ассоциативный массив.

Вот ты сейчас наверняка шокировал ТС'а до смерти!

P.S. Только не структура, а класс, а все функции в JS, включая конструктор класса, являются обычными методами объекта (ассоциативного массива) - либо глобального (обычная функция, в которой this указывает на глобальный объект), либо методом конкретного объекта (this указывает на пользовательский объект), но это несущественное замечание. :)
...
Рейтинг: 0 / 0
14.07.2020, 13:53
    #39979460
mini.weblab
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Группировка массива
Shitbox2
Это настолько редкие задачи, что за почти 40 лет никаких библиотек не появилось?

почему же не появились? появились! вот: https://www.sqlite.org/index.html

(а у нас здесь форум по редким и экзотическим задачам )
...
Рейтинг: 0 / 0
14.07.2020, 14:03
    #39979467
rdb_dev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Группировка массива
mini.weblab
Shitbox2
Это настолько редкие задачи, что за почти 40 лет никаких библиотек не появилось?

почему же не появились? появились! вот: https://www.sqlite.org/index.html
Не ограничивай ему выбор in-memory databases ! :)
...
Рейтинг: 0 / 0
14.07.2020, 16:25
    #39979544
Shitbox2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Группировка массива
CEMb

могу, минут 15-30. Я же правильно понял, что эта функция разбирает входящий массив по значению заданного поля, а потом суммирует значения из получившейся мультимапы по ключу?

Функция группирует массив по ключу. На выходе выдает массив групп. Каждая группа это по-сути копия первого элемента группы с дополнительным полем items, содержащем массив всех элементов группы (на поля groupField, groupValue можно забить). Некоторые поля представляют сумму аналогичных полей всех элементов группы.

Anatoly Moskovsky
Этот код немного не то делает, но я и не нанимался делать лабы студентам.
А подсмотреть как можно в С++ работать с такими структурами данных вполне можно на этом примере.

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

И с чего взяли, что я студент? Мне эта функция нужна, чтобы научиться писать нативные расширения для Ноды и сравнить насколько вырастет производительность и вырастет ли, вообще.
...
Рейтинг: 0 / 0
14.07.2020, 16:26
    #39979545
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Группировка массива
Shitbox2
И с чего взяли, что я студент?

Из профиля )))
...
Рейтинг: 0 / 0
14.07.2020, 16:33
    #39979551
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Группировка массива
Shitbox2
писать нативные расширения для Ноды и сравнить насколько вырастет производительность и вырастет ли, вообще.

Учтите что мой пример копирует массивы. Так что там есть куда оптимизировать
...
Рейтинг: 0 / 0
14.07.2020, 19:37
    #39979618
exp98
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Группировка массива
За 5К я могу потратиь 5 мин на написание, но только ... ведь компилить не обязательно, правда?
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Группировка массива / 19 сообщений из 19, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]