C#中在List<double>里查找股票折线图峰值点的技术问询
修复股票折线图峰值查找的代码问题
嘿,我看了你这段查找峰值的代码,发现两个关键问题得先修正:
问题1:索引越界异常
你的循环从i=0开始,这时候访问list[i-1]就是访问list[-1],直接会抛出索引越界错误——毕竟第一个元素根本没有左边的邻居。所以循环的起始索引得从1开始,同时要保证i的右边还有元素,循环结束条件要设为i < list.Count - 1(这样i+1才不会超出集合的最大索引)。
问题2:峰值判断逻辑搞反了
你写的list[i] > list[i-1] && list[i] < list[i+1],这是在找谷值(比左右都低的点),而不是峰值!峰值的判断逻辑应该是当前点比左右两个相邻点都大,条件要改成list[i] > list[i-1] && list[i] > list[i+1]。
修正后的基础版代码
先解决核心问题,得到能正确查找中间峰值的代码:
List<double> peak = new List<double>(); // 从第2个元素(索引1)开始,到倒数第2个元素(索引list.Count-2)结束 for (int i = 1; i < list.Count - 1; i++) { // 正确的峰值判断:当前点大于左右邻居 if (list[i] > list[i - 1] && list[i] > list[i + 1]) { peak.Add(list[i]); } }
进阶:包含边界点的峰值处理
如果你的股票折线图需要把边界点也算作峰值(比如开盘价直接是当天最高点,或者收盘价是最后时段的最高点),可以单独处理首尾两个点:
List<double> peak = new List<double>(); // 处理第一个点:只有一个元素时直接算作峰值,否则比第二个点大才算 if (list.Count == 1) { peak.Add(list[0]); } else if (list.Count > 1 && list[0] > list[1]) { peak.Add(list[0]); } // 处理中间的峰值点 for (int i = 1; i < list.Count - 1; i++) { if (list[i] > list[i - 1] && list[i] > list[i + 1]) { peak.Add(list[i]); } } // 处理最后一个点:比倒数第二个点大才算峰值 if (list.Count > 1 && list[list.Count - 1] > list[list.Count - 2]) { peak.Add(list[list.Count - 1]); }
这样就能覆盖所有可能的峰值情况啦,不管是中间的最高点,还是首尾的边界峰值都能准确找出来。
内容的提问来源于stack exchange,提问作者Khew Sei Fan
相关产品推荐
相关产品推荐

