gpt4 book ai didi

c++ - 如何根据一组规则/条件检查一组数据以进行分类?

转载 作者:行者123 更新时间:2023-11-30 03:34:32 26 4
gpt4 key购买 nike

我有一组银行帐户条目,它们存储在我定义的类 bankAccountEntry 的实例中。 bankAccountEntry 类具有数据成员

unsigned int year;
unsigned int month;
unsigned int day;
std::string name;
std::string accountNumberConsidered;
std::string accountNumberContra;
std::string code;
double amount;
std::string sortOfMutation;
std::string note;

我想对这些银行账户条目进行分类。

例如,如果 std::string name 包含子字符串 gasolineStation1gasolineStation2,则它应该归类在 下汽油。为了实现这种分类,我可以例如通过语句检查数据成员

if (std::count(bae.name.begin(), bae.name.end(),"gasolineStation1")>0
||
std::count(bae.name.begin(), bae.name.end(),"gasolineStation2")>0)
{
bae.setCategory("gasoline");
}

为了对我所有的银行账户条目进行分类,我有一大组这样的预定义规则/条件,我想将其作为输入参数提供给主程序。

有什么策略可以检查我的每个银行帐户条目是否符合规则/条件集,直到找到匹配项?

最佳答案

如果,big if 在这里,所有的规则都是简单的名称-类别映射,这可以相当干净地完成。如果规则不同……糟糕。

现在只看简单的情况,

为了便于阅读和解释,定义:

struct mapping
{
std::string name;
std::string category;
}

使用 std::pair<std::string,std::string> 可能有战术优势反而。并定义

std::vector<mapping> mappings;

将规则文件中的名称-类别配对读入 mappings .无法就此提供任何建议,因为我们不知道规则是什么样的。完成后

bool bankAccountEntry::categorize()
{
for (const mapping & kvp: mappings)
{
if (name.find(kvp.name) != std::string::npos)
{
setCategory(kvp.category);
return true;
}
}
return false;
}

这是蛮力。根据您的数据的外观,例如,如果它严格遵循命名方案,您确实可以加快速度。

如果规则更复杂,你会得到更像这样的东西:

struct mapping
{
std::function<bool(const bankAccountEntry&)> rule;
std::string category;
}

std::vector<mapping> mappings;

每个mapping::rule是一个接受 bankAccountEntry 的函数并决定是否 bankAccountEntry符合规则。例如:

bool gasolineStationRule(const bankAccountEntry& bae)
{
return std::count(bae.name.begin(), bae.name.end(),"gasolineStation1")>0 ||
std::count(bae.name.begin(), bae.name.end(),"gasolineStation2")>0;
}

哪个行不通 because std::count doesn't work like that .

有点像

bool gasolineStationRule(const bankAccountEntry& bae)
{
return (bae.name.find("gasolineStation1")!= std::string::npos) ||
(bae.name.find("gasolineStation2")!= std::string::npos);
}

会,但可以通过搜索一次“gasolineStation”来改进,如果找到“gasolineStation”,则测试它后面的字符是否为“1”或“2”。

如何获得 rule将 s 放入 vector 中会非常有趣。它可能需要大量的专用函数、Lambda 大军或成对树中的鹧鸪。问题中没有足够的说明来确定。

它可能看起来像

mappings.push_back(mapping{&gasolineStationRule, "gasoline"})

或者通过向 mapping 添加构造函数

mapping(std::function<bool(const bankAccountEntry&)> newrule,
std::string newcategory): rule(newrule), category(newcategory)
{

}

您可能会从

获得小的性能提升
mappings.emplace_back(&gasolineStationRule, "gasoline")

无论如何...

bool bankAccountEntry::categorize()
{
for (const mapping & kvp: mappings)
{
if (kvp.rule(*this))
{
setCategory(kvp.category);
return true;
}
}
return false;
}

同样,您对规则及其可预测性了解得越多,您就可以优化得越多。

Also look at std::find_if 作为 bankAccountEntry::categorize 的可能替代品.

Documentation on std::function .

关于c++ - 如何根据一组规则/条件检查一组数据以进行分类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41942994/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com