Найти и отсортировать список - PullRequest
0 голосов
/ 25 октября 2011

Итак, у меня есть список из 2 столбцов, подобных этому:

2834    2
2934    1
2712    1
2834    3
2889    1
2659    1
2934    1
2760    1
2173    1
2834    1
2760    1
2834    2

В первом столбце указан идентификатор товара, а во втором столбце указано количество приобретенного товара, цена каждого товара находится в другом файле. Что мне нужно сделать, так это найти общее количество каждого заказанного товара, умножить его на его цену и затем отобразить пять лучших товаров по выручке. Так, например, выше 2834 заказывается 8 раз, цена его составляет 2 доллара, поэтому общий доход за 2834 составляет 16 долларов. Как найти все вхождения (количество) одного предмета, сохранить его количество и идентификационный номер где-нибудь, и сделать то же самое для других предметов, не повторяя для предыдущего предмета. Мне сказали, что карты будут полезны здесь, но я не знаю, как их использовать.

Ответы [ 4 ]

4 голосов
/ 25 октября 2011

Используйте карту, где ключом является идентификационный номер, а значением является количество:

std::map<int, int> quantities;

Прокрутите список и обновите соответствующую запись на карте. Вы можете использовать оператор [] на карте для доступа к значению, соответствующему данному ключу. Например, если у вас есть идентификатор и количество из ваших данных, вы можете сделать это:

quantities[id] += quantity;

Это работает без инициализации карты, потому что если оператор [] запрашивает запись, которой еще нет на карте, он автоматически вставляется со значением по умолчанию, а значение по умолчанию для int равно нулю .

Теперь вы можете пройти по карте и найти цены на все ваши предметы. Итератор карты дает вам pair, где первый элемент - это ключ карты, а второй элемент - это значение для этого ключа. Вы можете написать такой цикл, чтобы напечатать содержимое карты:

for (std::map<int, int>::const_iterator it = quantities.begin();
    it != quantities.end();
    ++it)
{
  std::cout << it->first << " " << it->second << std::endl;
}

Если вы найдете цену для каждого предмета и умножите ее на it->second, у вас будет то, что вы ищете.

1 голос
/ 25 октября 2011

Было бы полезно использовать std :: map - это в основном массив, который индексируется по ключам.В вашем случае, идентификатор элемента будет ключевым.Обычно вы просто помещаете элемент в карту с помощью:

myMap[key] = value;

Так, например, предполагая, что readFromFile () заполняет id и qty:

// Declare a map that uses an int as a key, and an int as a value
std::map<int, int> myMap;

while (readFromFile(&id, &qty))
{
    myMap[id] += qty;
}

В первый раз, [] создаст элемент.Для итерации по окончательному списку вы можете использовать стандартные итераторы на карте, как и другие контейнеры STL.

0 голосов
/ 25 октября 2011

Это похоже на настройку реляционной базы данных. В одной таблице будут записи типа [Item_ID, Количество].
В другой таблице будут записи типа [Item_ID, Price].

Ваша задача, если вы решите ее принять, - создать две таблицы, по одной для каждого файла. Используйте Item_ID в первой таблице, чтобы найти количество. Используйте Item_ID во второй таблице, чтобы найти цену. Умножьте эти две переменные, чтобы определить общую стоимость для Item_ID:

unsigned int quantity = Quantity_Table[Item_ID];
double price = Price_Table[Item_ID];
double cost = price * quantity;

Начните с исследования структуры данных std::map. Также найдите Stack Overflow для «while getline c ++», чтобы узнать, как читать файлы.

0 голосов
/ 25 октября 2011

Я бы определил структуру product для хранения информации о каждом элементе.Структура будет содержать ID, quantity и price.
. Вы получите std::map<int, product>, где индексом будет ID.
, который вы прочитали бы в ценовом файле, идля каждой строки создайте новый product с этими ID и ценой, а затем добавьте его на свою карту с ID в качестве индекса.
Затем вы прочитаете в файле продаж и для каждогостроку, получите product по ссылке из карты по ID и добавьте число к quantity.
Наконец, вы должны выполнить итерацию по карте и выписать каждый ID иquantity упорядочено умножено на price.

Правильно ли я понял?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...