检测长整数列表中的尖峰和下降C#

时间:2016-04-27 16:35:42

标签: c# list intervals

您好我在尝试编写一个方法来读取列表中的每个数字并检测它的峰值和下降位置。这就是我到目前为止所做的:

我基本上认为如果我遍历列表,再次遍历它以获取列表中的下一个数字,然后检测它是否更多或更少。如果它更多,它将保存到一个列表,反之亦然。

我想要这个方法做的是确定哪里有100或更多的峰值,除了它做到这一点(这是'计数器')并且还保存点数字下降。

到目前为止,这只是一个下降,它会保存列表中的每个数字,直到它再次出现峰值,一旦它突然显示它没有数字,直到它再次下降等等。

我已经检查过'和' check2'尝试抵消它,在注意到一滴之后保存每一个数字,只保存一次但没有运气。

有什么想法吗?

public void intervalDetection()
{
    //Counter is the point in the list
    int counter = 0;
    int spike = 0;
    int drop = 0;

    //Loop through power list
    for (int i = 0; i < powerList.Count(); i++)
    {
        counter++;               
        int firstNumber = powerList[i]; 

        //Loop again to get the number after??
        for (int j = 1; j < 2; j++)
        {                  
            //Detect Spike
            spike = firstNumber + 100;
            drop = firstNumber - 100;                       

                if (powerList[j] > spike)
                {
                    if (check2 == false)
                    {
                        intervalStartList.Add(counter);
                        check2 = true;
                        check = false;
                    }
                }
                //Detect Drop
                else if (powerList[j] < drop)
                {
                    if (check == false)
                    {
                        intervalEndList.Add(counter);
                        check = true;
                        check2 = false;
                    }
                }

        }

2 个答案:

答案 0 :(得分:1)

  1. 创建整数&#34;平均&#34;
  2. 循环浏览列表/数组并将每个值添加到平均值
  3. 除以列表/数组的计数
  4. 循环列表/数组并检查偏差为平均整数
  5. DERP
  6. 代码示例:

    public class DSDetector {
       public static List<int>[] getDropsnSpikes(List<int> values, int deviation) {
          List<int> drops = new List<int>();
          List<int> spikes = new List<int>();
          int average = 0;
          foreach (int val in values) {
             average += val;
          }
          average = average/values.Count;
          foreach (int val in values) {
             if (val < average - deviation) {
                drops.add(val);
             }
             if (val > average + deviation) {
                spikes.add(val);
             }
          }
          //derp.
          return new List<int>{drops, spikes};
       }
    }
    

    未经测试,但我认为它有效。试试吧。

答案 1 :(得分:0)

你究竟是什么意思说“峰值”和“下降”? 假设您有以下整数列表

112,111,113,250,112,111,1,113

在这种情况下,值250是相对于平均值的峰值和1下降,您可以使用Kai_Jan_57答案来获取它。

但250也是峰值到先前的值113和112是下降250。 如果你想找到局部峰值和下降,你可以检查相对于前一个和下一个的每个值:找到平均值为avg =(val [i-1] + val [i + 1])/ 2并检查是否val [i]&gt ; avg + 100(峰值)或val [i]