0

对象数组 tArray 包含买家姓名和购买的数量,每个买家可以多次出现在对象数组中。我必须以数组的形式返回五个最大买家的姓名。

我试图与买方名称并行运行两个阵列,并且在另一个阵列中有总体积。

我的方法通常有缺陷,因为我得到了错误的结果,我该如何解决这个问题。

谢谢

ntransactions = 数组中的事务数

string* Analyser::topFiveBuyers()
{
//set size and add buyer names for comparison.
const int sSize = 5;
string *calcString = new string[sSize];
calcString[0] = tArray[0].buyerName;
calcString[1] = tArray[1].buyerName;
calcString[2] = tArray[2].buyerName;
calcString[3] = tArray[3].buyerName;
calcString[4] = tArray[4].buyerName;
int calcTotal[sSize] = {INT_MIN, INT_MIN, INT_MIN, INT_MIN, INT_MIN};

//checks transactions
for (int i = 0; i<nTransactions; i++)
{
    //compares with arrays
    for(int j =0; j<sSize; j++)
    {
        //checks if the same buyer and then increase his total
        if(tArray[i].buyerName == calcString[j])
        {
        calcTotal[j] += tArray[i].numShares;
        break;
        }
            //checks if shares is great then current total then replaces
            if(tArray[i].numShares > calcTotal[j])
            {           
            calcTotal[j] = tArray[i].numShares;
            calcString[j] = tArray[i].buyerName;
            break;
            }   
    }
}
return calcString;
}
4

3 回答 3

1

假设您被允许,我首先将值累积到 std::map 中:

std::map<std::string, int> totals;

for (int i=0; i<ntransactions; i++)
    totals[tarray[i].buyername] += tarray[i].numshares;

这将加起来每个买家的股份总数。然后,您想将该数据复制到 std::vector,并按份额数获得前 5 个。目前,我将假设您的结构(使用buyernamenumshares作为成员)命名为transaction.

std::vector<transaction> top5;

std::copy(totals.begin(), totals.end(), std::back_inserter(top5));

std::nth_element(top5.begin(), top5.begin()+5, top5.end(), by_shares());

为此,您需要一个名为的比较函子by_shares,如下所示:

struct by_shares { 
    bool operator()(transaction const &a, transaction const &b) { 
        return b.numshares < a.numshares;
    }
};

或者,如果您使用的编译器足够新来支持它,则可以使用 lambda 而不是显式仿函数进行比较:

std::nth_element(totals.begin(), totals.end()-5, totals.end(), 
    [](transaction const &a, transaction const &b) { 
        return b.numshares < a.numshares; 
    });

无论哪种方式,在 nth_element 完成后,您的前 5 个元素将位于向量的前 5 个元素中。我已经颠倒了正常的比较来做到这一点,所以它基本上是按降序工作的。或者,您可以使用升序,但从集合末尾指定点 5,而不是从开头指定 5。

我应该补充一点,还有其他方法可以做到这一点——例如,Boost bimap 也可以很好地完成这项工作。鉴于这听起来像是家庭作业,我的猜测是像 bimap 这样为您处理几乎整个工作的预打包解决方案可能不会/不会被允许(甚至std::map 可能出于几乎相同的原因被禁止)。

于 2013-03-12T14:12:46.017 回答
1

由于您可以拥有多次相同的买家,因此您必须为所有买家存储一个柜台,而不仅仅是其中的 5 个,因为无法知道您从前 5 名中删除的买家不应该是前 5 名的一部分(因为稍后可以将更多项目链接到该买家tArray)。

我建议使用 stl 地图,其关键是买家姓名并重视项目数量。tArray您通过迭代并汇总同一买家购买的所有商品来填充它。然后,您可以在地图上进行迭代并轻松检索 5 个顶级买家,因为每个买家只有一个条目。

于 2013-03-12T13:51:03.973 回答
0

当外循环开始时,索引i为零,内循环也是如此。这意味着第一个条件检查tArray[0].buyerName == calcString[0]哪个等于您在循环之前设置它的方式。这导致calcTotal[0]从内循环增加-2147483648和离开内循环。

我不确定,但这似乎不是人们想要的。

于 2013-03-12T13:35:15.220 回答