假设一arraylist : 1 3 3 5 5 6 (已经排序好)
能在新的arraylist中输出各个元素出现的次数(最好的算法):1 2 2 1  小弟用了顺序查找,感觉效率很低(数据量大),寻求最佳的算法 谢谢!

解决方案 »

  1.   

    用foreach遍历吧,在遍历过程中进行统计,任何所法都需要至少一次去便利arraylist
      

  2.   

    用foreach遍历吧 就是顺序查找 成本就是O(n)
    不知道数据量究竟有多大...
    很大的情况可以使用数据库...然后使用SQL 的分组计数
    C#的运行效率永远也不会好过c++如果是多CPU系统(包括超线程)建议使用并行计算的方式.
      

  3.   

    其实已经排序好了,还有必要顺序查找马?相邻的两个比较 不等 指针迁移 相等count++ 但是代码不知道怎么很好的表示? 请详细指示以下!
      

  4.   

    Arraylist 你的数据  //假设是INT
    Arraylist 数据统计计数Class Count
    {
     int Data;
     int Count=0;
    }Count temp=new Count();
    temp.Data=你的数据[0];
    for(int a=0;a<你的数据.Count;a++)
    {
      if(temp.Data==你的数据[a])
      {
       temp.Count++;     }
       else
      {
       数据统计计数.Add(temp);     temp=new Count();
       temp.Data=你的数据[a]; 
       temp.Count++;
      }
    }
    数据统计计数.Add(temp);
    伪代码就是这样了
      

  5.   

    to zhiang75(zhiang75)
    你的那个算法是行不通的!
      

  6.   

    如果只有Arraylist ,我也就只会foreach了 呵呵。
    不过只要有可能  我一定会把它搞到sql里  或者 xml里  呵呵  应该就好搞了
      

  7.   

    这是我利用排序后的arraylist来统计里面元素出现的次数,该如何修改一下呢?                           int index=1;
    double m,n;
    ArrayList arrIndex=new ArrayList ();
    for(int i=0;i<arr.Count;i++)//排序后的arr
    {
    m=Convert.ToDouble(arr[i]);
    n=Convert.ToDouble(arr[i+1]);
    if(m==n)
    index++;
    else
    if (index==1)
    {
    arrIndex.Add (1);
    }
    else
    {
    arrIndex.Add (index);
    index=1;
    }  
    } //输出存储统计次数的数组内容
    string strIndex=string.Empty ;
    for(int i=0;i<arrIndex.Count ;i++)
    {
    strIndex+=arrIndex[i].ToString ()+" ";
    }
    MessageBox.Show (strIndex);
      

  8.   

    select count(code) from table where xxxx order by code
      

  9.   

    利用sql语句的确可以求出列中的极值,但是对极值如何取出,进行其他的计算?
    我只会将极值在查询分析器中列出在表格中.
      

  10.   

    可以把数据保存到DataTable里面  然后结合 Expression 进行排序分组
      

  11.   

    我按照楼上写法改的,编译通过,算法还可以
    ArrayList arrayint=new ArrayList ();
    int index=1;
    ArrayList array1=new ArrayList ();
    array1 .Add ("1");
    array1 .Add ("3");
    array1 .Add ("5");
    array1 .Add ("3");
    array1 .Add ("2");
    array1 .Add ("5");
    array1 .Sort ();

    int m=0;
    int n=0; for(int i=0;i<array1.Count ;i++)
    {
    m=Convert.ToInt32 ( array1 [i].ToString ());
    if(i<array1.Count-1 )
    n=Convert.ToInt32 ( array1 [i+1].ToString ());
    else
    {
    n=99999;
    }
    if(m==n)
    {
    index++;

    }
    else
    {
    if(index==1)
    arrayint .Add (1);
    else
    {
    arrayint .Add (index);
    index=1;

    }

    }




    } foreach(object obj in arrayint )
    {
    Console.WriteLine ("{0}",(int)obj);
    }