有如下数据放在一个数组里:
1001
1002
1001
1003
1001
1004
1004
我想给他们后面添加一个索引,结果放在另一个整型数组里
1001 1
1002 1
1001 2
1003 1
1001 3
1004 1
1004 2
就是把最后一列结果放在一个数组里
如果用两个循环来做的话,可以实现,但是当数据上10万行时,效率极低。希望高手帮我出一个高效的算法,谢谢!!!

解决方案 »

  1.   


    int [] addInt=new int[array.count];
    for(int i=0;i<array.count;i++)
       for(int j=0;j<i;j++)
           {
             if(array[i]==array[j])
              addInt[i]++;
           }这种方式可以实现。但是效率很低,我想求一个高效的,快速的算法。高手些帮帮我!
      

  2.   

    你可以考虑换种思路,在添加第一个数组时就别添加到数组里面,添加到Dictionary里面,key就放索引,value放值
      

  3.   

    不可以排序
    我想过用Hashtable 和字典来做,可以水平有限没有弄出来,高手帮帮我
      

  4.   

    这个副不符合要求? key是值 value是次数 int[] ia = new int[] { 1001, 1002, 1001, 1003, 1001, 1004, 1004 };
                Hashtable ht = new Hashtable();
                for (int i = 0; i < ia.Length; i++)
                {
                    if (ht.Contains(ia[i].ToString()))
                    {
                        ht[ia[i].ToString()] = Convert.ToInt32(ht[ia[i].ToString()]) + 1;
                    }
                    else
                    {
                        ht.Add(ia[i].ToString(), 1);
                    }
                }
      

  5.   

    这样总行了吧 格式都一样了int[] ia = new int[] { 1001, 1002, 1001, 1003, 1001, 1004, 1004 };
                int[] ic = new int[ia.Length];
                Hashtable ht = new Hashtable();
                for (int i = 0; i < ia.Length; i++)
                {
                    if (ht.Contains(ia[i].ToString()))
                    {
                        ht[ia[i].ToString()] = Convert.ToInt32(ht[ia[i].ToString()]) + 1;
                        ic[i] = Convert.ToInt32(ht[ia[i].ToString()]);
                    }
                    else
                    {
                        ht.Add(ia[i].ToString(), 1);
                        ic[i] = 1;
                    }
                }
      

  6.   

    其实你原先的做法是最高效的做法,不需要用到Hashtable,只不过你没有写对。
      

  7.   

    int[] index = new int[array.Count];
    Hashtable ht = new Hashtable();
    for ( int i = 0; i < array.Count; i++ )
    {
    int t;
    object tmp = ht[array[i]];
    if ( tmp == null )
    {
    t = 1;
    ht.Add( array[i], t );
    }
    else
    {
    t = ( int )tmp + 1;
    ht[array[i]] = t;
    }
    index[i] = t;
    }
      

  8.   

    虽然已经结贴了,不过还是给你改进下你原先的算法吧,这样肯定速度很快,对于重复率多的情况是最有效的:            int[] array = new int[] { 1001, 1002, 1001, 1003, 1001, 1004, 1004 };
                int[] addInt = new int[array.Length];
                for (int i = 0; i < array.Length; i++)
                {
                    addInt[i] = 1;
                    for (int j = i - 1; j >= 0; j--)
                    {
                        if (array[i] == array[j])
                        {
                            addInt[i] += addInt[j];
                            break;
                        }
                    }
                }
      

  9.   

    你试试下面的方法吧,应该比双循环好点,期待高手出更快的方法
    public Int32[] Function(Double[] data)
            {
                Dictionary<Double, Int32> dict = new Dictionary<Double, Int32>();            for (Int32 index = 0; index < data.Length; index++)
                {
                    if (dict.ContainsKey(data[index]))
                    {
                        dict[data[index]]++;
                    }
                    else
                    {
                        dict.Add(data[index], 1);
                    }
                }            Int32[] result = new Int32[data.Length];            for (Int32 index = data.Length - 1; index >= 0; index--)
                {
                    result[index] = dict[data[index]];
                    dict[data[index]]--;
                }            return result;
            }