如何将x项尽可能均匀地分布在y列上

本文关键字:分布 列上 尽可能 | 更新日期: 2023-09-27 18:06:52

我有一个项目集合。我还设置了可能会更改的动态列数。

我需要一个算法,将我的项目重新分配到桶中,这样我就可以将它们绑定到UI。我想先填充向下再填充横向,但是要先填充宽度。

我想要最均匀的"矩形"分布。

这个排列是错误的,因为它没有填满第9列。

            1 2 3 4 5 6 7 8 9
            A D G J M P S V
            B E H K N Q T 
            C F I L O R U

这种安排是正确的,尽管不太理想……

            1 2 3 4 5 6 7 8 9
            A D G J M P S U V
            B E H K N Q T
            C F I L O R

…比这张更平衡。

            1 2 3 4 5 6 7 8 9
            A D G J M O Q S U
            B E H K N P R T V
            C F I L 

谢谢。这是问题A,我已经解决了

如何将x项尽可能均匀地分布在y列上

这将以'左侧偏置'来平衡桶中的项。

    public static T[][] FillBucketsEvenly<T>(IEnumerable<T> items, int bucketCount)
    {
        int itemsPerBucket = items.Count() / bucketCount;
        int countOfBucketsTakingExtraOne = items.Count() % bucketCount;
        T[][] buckets = new T[bucketCount][];
        // Build empty array structure.
        for (int i = 0; i < bucketCount; i++)
        {
            if (i < countOfBucketsTakingExtraOne)
            {
                buckets[i] = new T[itemsPerBucket + 1];
            }
            else
            {
                buckets[i] = new T[itemsPerBucket];
            }
        }
        // Fill the structure.
        int itemsAdded = 0;
        foreach(var bucket in buckets)
        {
            int grabSize = bucket.Count();
            var grab = items.Skip(itemsAdded).Take(grabSize);
            for (int i = 0; i < grabSize; i++)
            {
                bucket[i] = grab.ElementAt(i);
            }
            itemsAdded += grabSize;
        }
        return buckets;
    }