我有一个像这样的数组
time_in_seconds;value
2.353463;0
2.453463;10
2.553463;10
2.653463;9
2.853463;0
3.353463;0
5.353463;2
我想用
填充List<Times>
public class Times
{
public double[] time_rising_start {get;set;}
public double[] time_rising_end {get;set;}
public double[] time_staying_end {get;set;}
public double[] time_falling_end {get;set;}
}
,其中
double[] time = new double[2];
time[0] = time_start
time[1] = time_start_value
分别
double[] time = new double[2];
time[0] = time_end
time[1] = time_end_value
有很多方法,我正在寻找一种智能的方法来将其概括为上升,停留和下降。这意味着
2.353463;0
2.453463;10
正在上升,0 - > 10
2.453463;10
2.553463;10
待在,10 - &gt; 10
2.553463;10
2.653463;9
2.853463;0
正在下降,10 - &gt; 9 - &gt; 0
2.853463;0
3.353463;0
停留,0 - &gt; 0
等
time_rising_start
和time_falling_end
应始终位于value = 0
。在上面提到的例子中,它是
time_rising_start = 2.353463;
time_rising_end = 2.453463;
time_staying_end = 2.553463;
time_falling_end = 2.853463;
下一个对象
time_rising_start = 3.353463;
...
它应该能够处理像value
0
10
11
10
11
12
7
3
0
应该等于
0 <- time_rising_start
10 <- time_rising_end
11
10
11
12 <- time_staying_end
7
3
0 <- time_falling_end
比较之前的值很容易。我会看它是否低于它上升等等。但由于这不是那么简单,我正在寻找一种有效的方法。
答案 0 :(得分:3)
创建一组状态(例如枚举):Initial
,Rising
,Falling
,Steady
。
跟踪state
和上次看到的值current
和current_time
。
在伪代码中:
state = Initial
current = first value
current_time = first time
foreach (value,time) after first
switch on the state
case Initial:
if (value > current_value) { ... output rising, state = Rising }
else ...
current = value
case Rising:
if (value > current_value) { // do nothing, still rising }
...
在处理每个值时,状态机需要决定是否需要更改状态以及是否输出某些内容。在某些州,某些值只会前进到下一个值。最后,您可能需要再输出一个值。
这是一个经典的状态机实现。有更高级的状态机(分层的)。每个开发人员都应该了解状态机的工作原理以及如何实现状态机,因为它们很常见。
UML State Machines是该主题的一个很好的参考。