序列数索引(排序索引)

对于任意给定的一组数,从大到小依次取最大值的索引位置,构成的索引映射序列。


// -------------------------------------------
// 示例:
static void test()
{
    long[] weight = new long[] { 3, 2, 5, 1, 1 };
    int[] maxMap = Tools.getMaxMap(weight);

    MessageBox.Show(ToString(weight) + " 的序列数索引为:\r\n" +ToString(maxMap));
}

/// <summary>
/// 按数值从大到小的顺序依次获取各个值所在的索引位置
/// 如:3、2、5、1、1 从大到小的索引为:2、0、1、3、4
/// </summary>
public static int[] getMaxMap(long[] iteams)
{
    int[] map = new int[iteams == null ? 0 : iteams.Length]; 
    List<int> have = new List<int>();       // 记录各索引位置是否已记录
    for (int i = 0; i < iteams.Length; i++) // 每轮循环获取一个最大值索引
    {
        long max = 0;
        int index = -1;

        for (int j = 0; j < iteams.Length; j++)
        {
            if (have.Contains(j)) continue;     // 跳过已记录项

            if (iteams[j] > max || index == -1) // 记录更大值索引
            {
                max = iteams[j];
                index = j;
            }
        }

        map[i] = index;     // 记录此次循环获取到的最大值索引
        have.Add(index);
    }
    return map;
}

/** 转化long字符数组为字符串 */
public static string ToString(Array A)
{
    string tmp = "";
    foreach (object a in A)
    {
        tmp += ";" + a;
    }
    return tmp.Length > 0 ? tmp.Substring(1) : tmp;
}


2017-08-06:修改排序数生成,死循环bug


        # region 条件优选处理逻辑

        // -------------------------------------------  
        // 示例:  
        public static void test()
        {
            float[] weight = new float[] { 3, 2, 5, 1, 1 };
            int[] maxMap = getMaxMap(weight);
            float[] Rate = getRate(weight);

            MessageBox.Show(ToString(weight) + " 的,\r\n序列数索引为:\t" + ToString(maxMap) + "\r\n排名分值为:\t" + ToString(Rate));
        }  

        /// <summary>
        /// 对iteams中的数据进行排名(采用浮点数排名),第一名取100分,第二名往后依次递减。
        /// choiceMax指示按最大或最小值进行排名
        /// </summary>
        public static float[] getRate(float[] iteams, bool choiceMax = true)
        {
            int[] maxMap = getMaxMap(iteams);           // 获取最大排名索引信息
            float[] rates = new float[maxMap.Length];   // 排名评分信息

            for (int i = 0; i < maxMap.Length; i++)
            {
                int index = maxMap[i];
                float value = choiceMax ? (maxMap.Length - i) : (i + 1);  // 获取对应的排名对应的值
                float rate = value / maxMap.Length * 100;// 获取对应的百分排名值

                rates[index] = rate;                    // 记录排名分值
            }

            return rates;
        }

        /// <summary>  
        /// 按数值从大到小的顺序依次获取各个值所在的索引位置  
        /// 如:3、2、5、1、1 从大到小的索引为:2、0、1、3、4  
        /// </summary>  
        public static int[] getMaxMap(float[] iteams)
        {
            List<int> map = new List<int>();

            // 获取所有索引值
            List<int> indexs = new List<int>();
            for (int i = 0; i < iteams.Length; i++) indexs.Add(i);

            while (indexs.Count > 0)
            {
                // 获取最大值的索引信息
                int index = indexs[0];
                float max = iteams[index];
                foreach (int i in indexs)
                {
                    if (iteams[i] > max) // 记录更大值索引  
                    {
                        max = iteams[i];
                        index = i;
                    }
                }

                map.Add(index);
                indexs.Remove(index);
            }

            return map.ToArray();
        }


        /** 转化long字符数组为字符串 */
        public static string ToString(Array A)
        {
            StringBuilder tmp = new StringBuilder();
            foreach (object a in A)
            {
                tmp.Append(";" + a);
            }

            return tmp.Length > 0 ? tmp.ToString().Substring(1) : tmp.ToString();
        }  

        // -------------------------------------------  

        /// <summary>
        /// 对datas中的数据,按preferMax进行综合评分。
        /// 按列数据分别评分,评分后取乘积,再次转化为百分制
        /// </summary>
        public static List<float> getRate(List<List<float>> datas, bool[] preferMax, bool addMode = false)
        {
            // 获取所有列的评分信息
            List<float[]> allRates = new List<float[]>();
            for (int i = 0; i < datas.Count; i++)
            {
                float[] data = datas[i].ToArray();
                float[] rate = getRate(data, preferMax[i]); // 获取当前列的评分

                allRates.Add(rate);
            }

            // 进行综合评分
            List<float> Rate=null;
            foreach (float[] rate in allRates)
            {
                if (Rate == null) Rate = Init(rate.Length, addMode ? 0 : 100);
                Rate = CombineRate(Rate, rate, addMode);
            }

            // 若为叠加模式则计算平均得分
            if (addMode)
            {
                for (int i = 0; i < Rate.Count; i++)
                {
                    Rate[i] = Rate[i] / datas.Count;
                }
            }

            return Rate;
        }

        /// <summary>
        /// 使用默认值初始化指定大小的List
        /// </summary>
        private static List<float> Init(int size, float defultValue)
        {
            List<float> list = new List<float>();
            for (int i = 0; i < size; i++)
            {
                list.Add(defultValue);
            }
            return list;
        }

        /// <summary>
        /// 合并评分列表1、评分列表2
        /// addMode简单叠加模式
        /// </summary>
        private static List<float> CombineRate(List<float> rate1, float[] rate2, bool addMode = true)
        {
            List<float> list = new List<float>();
            for (int i = 0; i < rate1.Count || i< rate2.Length; i++)
            {
                float rate = addMode ? (rate1[i] + rate2[i]) : CombineRate(rate1[i], rate2[i]);
                list.Add(rate);
            }
            return list;
        }

        /// <summary>
        /// 合并评分1、评分2
        /// </summary>
        private static float CombineRate(float rate1, float rate2)
        {
            float rate = rate1 * rate2 / 100;
            return rate;
        }

        #endregion

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值