注意:这是一般编程问题,并非针对任何语言,但您可以在答案中使用您选择的语言来解释逻辑。
我想要一个方法来获取一串文本,比如说"Default(0-100)=20"
,然后从中提取出来的默认小时工资为20小时0到100.这可以用于说“默认”( 101-245)= 25“小时101到245小时的默认小时工资是25.还允许它定义”Brian(0-29)= 15“用户”Brian“将有非违约小时工资小时0到29的15。
我的第一印象是通过正则表达式运行字符串,例如^(\w*)\((\d*)-(\d*)\)$
,它可以拾取文本以及范围的较小和较高端。
存储此信息的最佳方式是什么,以便以后使用?多维数组?散列吗
如果您确实存储了这些信息,那么实际使用这些信息的最佳方式是什么?
如果说我们使用了"Default(0-100)=20"
& "Default(101-245)=25"
和工作小时数为150。
答案 0 :(得分:1)
我不是很有经验,但我试图为自己解答,也许它可以帮助你。
对于问题的第一部分,对于像这样的字符串,只需将给定字符串拆分到适当的位置即可。大多数框架都有类来执行此操作。在你的情况下,例如,将是() - 和=
结果:
默认, (, 0, - , - 100, ) , =, 20
当您使用一致的字符串格式时,您的值始终位于相同的索引处。选择它们,如果需要转换并存储在变量中;
假设你在谈论面向对象的编程,我会在你的情况下做这样的事情:
使用名称创建一个类员工,并将每小时工资作为实例变量创建。这个类还有一个方法calculateWageForHours(int hours)。每小时工作可以存储在dictionairy或sth simlilar中 - 取决于你的框架。你把开始时间作为dict的关键,把工资作为价值。你不需要结束时间,因为一个速率一直到达下一个“阶段”。
计算工资的方法看起来像这样:(根据具体情况肯定有更好的方法)
calculateWageForHours(int hours) {
for (int i = 0, i < dict.count - 1, i++) {
if (hours < dict[i + 1].key /* the int-value for the hour */ -1) {
float wage;
for (int j = 0, j < i, j++) {
wage += (dict[j + 1].key - 1) * dict[j].value;
}
wage += (hours - dict[i].key - 1) * dict[i].value;
return wage;
}
return calculateWageForHours(dict.lastkey - 1)
+ (hours - dict.lastkey) * dict.lastkey.value;
可以在程序中的任何位置设置默认部分,您可以在其中设置员工级。只需编写一个方法,为员工创建默认的dictionairy。 (也可以在对象初始化中完成,然后从控制器类中提交nessesairy参数)
答案 1 :(得分:0)
很难看到通过数据库中的传统配置以及像XML配置文件更明确的方式这样做的好处。
一个问题是确保表达单独且有效(一致 - 即“默认(0-40)= 40,默认(38-100)= 60”)
允许纯文本表示允许一些感知的灵活性,但您仍然需要确保您可以处理您正在解析的任何表示形式。与在用例扩展时简单地添加选项和重构相比,过度构建引擎以便能够“处理任何东西”(通过成为编译器)可能是一种错误的经济。
如果你想允许表达式,在我看来你可以使用真正的表达式 - 例如某些语言有一个可以评估表达式的Eval函数。或者允许用户编写脚本。
有关表达式评估,请参阅:http://flee.codeplex.com/
答案 2 :(得分:0)
虽然很难从您问题中的信息中看出来,但您似乎基本上是在尝试实施Domain Specific Language(或DSL)来为您的系统定义一些规则。
也许您应该将DSL的实现视为解决问题的一种方法。
答案 3 :(得分:0)
我认为存储类型和正则表达式在建模时最不重要。您实际上是在编写一个简单的规则引擎来计算员工的薪水。弄清楚这些规则是这个问题最重要的部分。确保规则是完整的,一致的和确定性的是另一个重要的部分。确定性,我的意思是你不能有两个规则,如:
Default(0-100)=20
Default(50-100)=25
因为系统不知道如何计算50-100小时的工资,因为有两种选择。完成后,我的意思是规则应该能够计算给予任何员工的工资和他们工作的小时数。再举一个例子:
Default(0-100)=20
Default(125-150)=25
如果一名员工工作了150个小时,系统就不会知道101-125小时的工资。所以不完整是另一个问题。
假设规则是完整且确定的,我们可以继续进行建模。如果工作时间可以是分数,那么解决方案将需要按比例分配小时工资。看起来有一个默认工资,然后是员工特有的工资。特定于员工的工资始终优先于默认工资。所以在一个简单的if-else伪代码中,它看起来像:
get-wages (employee, hours-worked)
total-wage = 0
for each ith hour worked
hourly-wage = get-hourly-wage (employee, ith-hour)
fraction-of-hour-worked = get-fraction-of-hour-worked(ith-hour, hours-worked)
total-wage += hourly-wage * fraction-of-hour-worked
return total-wage
end
get-hourly-wage (employee, hour-number)
if employee has specific wage for hour number
return that
else if there is default wage for hour number
return that
else
throw error("no wage available for hour number [hour-number]")
end
get-fraction-of-hour-worked (hour-number, hours-worked)
difference = hours-worked - hour-number
if difference >= 1
return 1
else
return difference
end
Checkout this article提供了一种编写规则引擎的方法,有趣的是它使用员工和工资作为示例,因此它可能会有所帮助。
有关规则引擎的更多有趣文章,您可能会发现它们很有用:
答案 4 :(得分:0)
为什么不删除字符串中不需要的所有内容,并使用PHP的爆炸功能(如提到的@Tobi)?
因此,您的字符串将为"Brian,0,100,20"
和"Brian,101,245,25"
function get_wages_array($the_string) {
return explode(',', $the_string);
}
$wages = get_wages_array('Brian,0,40,14.75');
$工资现在看起来像这样:
Array(
[0] => 'Brian',
[1] => '0',
[2] => '40',
[3] => '14.75'
)
我会将结果存储在一个多维数组中,然后遍历它们以获得所有的时间和工资。