powered by simpleCommunicator - 2.0.58     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Группировка массива
19 сообщений из 19, страница 1 из 1
Группировка массива
    #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
Группировка массива
    #39979233
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shitbox2
Мне кажется для любого специалиста написать такое на своём языке это 5 минут труда или я ошибаюсь?)

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

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

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


Для кого это 5 мин, потратьте их, пожалуйста, сэкономьте мне пол дня гугления нужных методов. Будете JS изучать, я вам потом время сэкономлю :-) Тут нет задачи просто написать, чтобы работало - примерно представляю, как это должно быть. Интересует как это напишут люди, которые не первый год работают с языком.
...
Рейтинг: 0 / 0
Группировка массива
    #39979274
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shitbox2
Будете JS изучать, я вам потом время сэкономлю :-)
JS изучать
Shitbox2
Кто-нибудь может переписать эту функцию на Си?
на Си нет, не смогу
...
Рейтинг: 0 / 0
Группировка массива
    #39979292
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shitbox2
Для кого это 5 мин, потратьте их, пожалуйста, сэкономьте мне пол дня гугления нужных методов. Будете JS изучать, я вам потом время сэкономлю :-) Тут нет задачи просто написать, чтобы работало - примерно представляю, как это должно быть. Интересует как это напишут люди, которые не первый год работают с языком.
Для тех, кто владеет С++, тем JavaScript - лёгкое чтиво перед сном. На Си это выльется в килобайты исходного кода и даже на С++ в 5 минут не уложиться... И у нас нет стимула!
...
Рейтинг: 0 / 0
Группировка массива
    #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
Группировка массива
    #39979375
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shitbox2
Серьезно? Никто на Си++ никогда не работал с динамическими массивами и не создавал объекты с переменным количеством полей?
...
Я плохо знаю Си++, только основы, но могу с уверенностью сказать...
Ты ничего не можешь с уверенностью сказать, потому что не знаешь даже основ С++.

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

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

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

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

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

Да. Это исчезающе редкие задачи.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Группировка массива
    #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
Группировка массива
    #39979446
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrav
В JavaScript "структура" -- это собственно и есть ассоциативный массив.

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

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

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

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

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

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

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

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

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

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

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

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


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