using System;
using System.Collections.Generic;
using System.Text;

namespace Sky.Darkness.Commons.Util
{
    public class ArrayHelper
    {
        /**
         * 将该数组中包含于另一个数组中的元素清除
         */
        public static int[] ClearRepeat(int[] initArray, int[] notContainArray)
        {
            List<int> newArray = new List<int>();
            
            foreach (int initData in initArray)
            {
                if (GetValueIndex(notContainArray,initData) == -1)//数组中不包含这个元素
                {
                    newArray.Add(initData);
                }
            }

            return newArray.ToArray();
        }

        /**
         * 返回该元素在数组中的下标
         */
        public static int GetValueIndex(int[] array,int data)
        {
            if (array == null)
                return -1;
            

            for (int i = 0; i < array.Length; i++)
            {
                if (array[i] == data)
                {
                    return i;
                }
            }

            return -1;
        }

        /**
         *  返回指定数组中的 N个随机数
         */
        public static int[] GetRandom(int[] initArray, int count)
        {
            List<int> newArray = new List<int>();
            int[] index = GetRandom(0,initArray.Length,count);

            for (int i = 0; i < index.Length; i++)
            {
                newArray.Add(initArray[index[i]]);
            }

            return newArray.ToArray();
        }

        /**
         *  返回指定数组中（不包含于另一个数组）的 N个随机数
         */
        public static int[] GetRandom(int[] initArray, int count, int[] notContainArray)
        {
            int[] arr = ClearRepeat(initArray, notContainArray);
            return GetRandom(arr, count);
        }

        /**
         *  返回指定区间的 N个随机数
         */
        public static int[] GetRandom(int minValue,int maxValue,int count)
        {
            // 最大数与最小数之间数据的个数
            int numbersCount = maxValue - minValue;
            // 将最大数与最小数之间数据放到 numbers数组中
            int[] numbers = new int[numbersCount];
            for (int i = 0; i < numbersCount; i++)
            {
                numbers[i] = minValue + i;
            }

            // 如果该数据段间的数据没有需要返回的数据量多
            // 则 将只返回 numbersCount（所有数据） 个数据
            if (numbersCount < count)
            {
                count = numbersCount;
            }

            // 定义存放需要放回数据的数组
            int[] indexs = new int[count];
            for (int i = 0; i < count; i++)
            {
                // 生成随机下标
                Random random = new Random();
                int randomNum = random.Next(0, numbersCount);

                // 从numbers数组中取出一个数据
                indexs[i] = numbers[randomNum];

                // 将numbers数组的最后一个数据存放到已经被取过下标的数据中
                numbers[randomNum] = numbers[numbersCount - 1];
                // 生成随机下标的总个数自减
                numbersCount--;
            }

            return indexs;
        }
    }
}
