zoukankan      html  css  js  c++  java
  • D365 FO Array增加排序

    X++的集合类,Array,List,Set里没有可以提供排序的功能,如果要对元素排序不是很方便。

    D365 FO支持扩展,所以可以很方便地给这些集合类增加排序功能,这里以Array为例,只实现了数值和字符串的排序,至于class和record类型的,目前还没遇到需要排序的场景,就暂时不实现了,用到再说。

    [ExtensionOf(classStr(Array))]
    public final class Array_Class_Extension
    {       
        /// <summary>
        /// 使用快速排序法对Array元素进行排序    
        /// </summary>
        public void sort()
        {
            this.quickSort(1, this.lastIndex());        
        }    
        private void quickSort(
          int _left, 
          int _right)
        {
            int i = _left;
            int j = _right;        
            if (i < j)
            {
                anytype pivot = this.value(i);
                while (i < j)
                {
                    while (this.greaterThan(this.value(j), pivot) && (i < j))
                    {
                        j--;
                    }                
                    this.value(i, this.value(j));                
                    while (this.lessThanOrEqual(this.value(i), pivot) && (i < j))
                    {
                        i++;
                    }
                    this.value(j, this.value(i));
                }
                this.value(i, pivot);
                this.QuickSort(_left, i - 1);
                this.QuickSort(j + 1, _right);
            }
        }
    
        private boolean greaterThan(
            anytype _valueLeft, 
            anytype _valueRight)
        {        
            switch (this.typeId())
            {
                case Types::Int64:
                case Types::Integer:
                case Types::Real:
                    return _valueLeft > _valueRight;
                default:
                    return strCmp(_valueLeft.toString(), _valueRight.toString()) == 1;
            }
        }
    
        private boolean lessThanOrEqual(
            anytype _valueLeft,
            anytype _valueRight)
        {
            switch (this.typeId())
            {
                case Types::Int64:
                case Types::Integer:
                case Types::Real:                
                    return _valueLeft <= _valueRight;
                default:
                    return strCmp(_valueLeft.toString(), _valueRight.toString()) == -1 
                            || strCmp(_valueLeft.toString(), _valueRight.toString()) == 0;
            }
        }
    
        /// <summary>
        /// 把排序后的数组以字符串方式拼接输出
        /// </summary>
        /// <param name = "_delimiter">元素之间的分隔符</param>
        /// <returns>排序后以分隔符连接的字符串</returns>
        public str sortString(str _delimiter = "")
        {
           this.sort();
    
            str destStr = "";
            for (int i = 1; i <= this.lastIndex(); i++)
            {
                destStr += this.value(i).ToString() + _delimiter;
            }
            if (_delimiter)
            {
                return subStr(destStr, 1, strLen(destStr) -1);
            }
            else
            {
                return destStr;
            }
        }
    
    }
  • 相关阅读:
    html+php超大视频上传功能
    html+php超大视频上传教程
    html+php超大视频上传方案
    html+php超大视频上传技术
    html+php超大视频上传实例解析
    html+php超大视频上传示例
    html+php超大视频上传实例
    矩阵求导
    概率密度
    概率分布函数
  • 原文地址:https://www.cnblogs.com/Farseer1215/p/14191879.html
Copyright © 2011-2022 走看看