【问题标题】:Sorting an array to avoid neighboring items having duplicate attributes对数组进行排序以避免相邻项具有重复属性
【发布时间】:2011-04-21 00:45:25
【问题描述】:

我有一个对象数组。每个对象都有一个颜色属性,可以是“红色”、“蓝色”、“黄色”、“绿色”、“橙色”或“紫色”。数组中有 20-30 个对象,因此颜色会重复。我的目标是对数组进行排序,以便没有颜色彼此相邻。颜色分布并不完全均匀,而是接近。

这是我目前所拥有的。它检查下一个和上一个对象的颜色匹配,如果找到匹配,则将其移动到数组的末尾。

private function sortColors():void
{
    var getNext:uint;
    var getPrev:uint;
    var maxCount:uint = colorArray.length;
    for (var i:uint = 0; i < maxCount; i++) {
        var cur:ValueObject = colorArray[i];
        (i == maxCount-1) ? getNext = 0 : getNext = i+1;
        (i == 0) ? getPrev = maxCount-1 : getPrev = i-1;
        var next:ValueObject = colorArray[getNext];
        var prev:ValueObject = colorArray[getPrev];
        if (cur.color == next.color) {
            var move:ValueObject = colorArray[getNext];
            colorArray.splice(getNext, 1);
            colorArray.push(move);
        }
        if (cur.color == prev.color) {
            var move:ValueObject = colorArray[getPrev];
            colorArray.splice(getPrev, 1);
            colorArray.push(move);
        }
    }
}

这工作正常,但如果有更多某种颜色,它们最终会在最后重复。我可以在最后添加一些东西来将它们重新混合,但我觉得必须有更好的方法。有人启发我。

【问题讨论】:

    标签: arrays actionscript-3 sorting object actionscript


    【解决方案1】:

    试试:

    var colorObjects:Array = [/* list of objects with colors - populated below*/];
    var jumbled:Array = [];
    
    var lastColor:String = "";
    function getDifferentTile():void
    {
        if(lastColor.length == 0)
        {
            jumbled.push(colorObjects.pop());
            lastColor = jumbled[0].mycolor;
        }
        else
        {
            var i:Object;
            for each(i in colorObjects)
            {
                var repeat:uint = 0;
                if(i.mycolor != lastColor)
                {
                    jumbled.push(i);
                    lastColor = i.mycolor;
    
                    colorObjects.splice(colorObjects.indexOf(i), 1);
    
                    return;
                } else {
                   repeat++;
                }
                if (repeat > 0 && repeat == colorObjects.length) {
                   jumbled.push(i);
                   colorObjects.splice(colorObjects.indexOf(i), 1);
                   return;
                }
            }
        }
    }
    
    // list of random colors
    var colors:Array = ["0x000000","0x444444","0xFFFFFF","0xFF00FF"];
    
    // prepare random array for test
    var i:uint = 0;
    for(i; i<100; i++)
    {
        var obj:Object =
        {
            mycolor: colors[uint(Math.random()*colors.length)]
        };
    
        colorObjects.push(obj);
    }
    
    
    // fill the jumble array until the original listing is empty
    while(colorObjects.length > 0)
    {
        getDifferentTile();
    }
    
    
    // output jumbled
    var j:Object;
    for each(j in jumbled)
    {
        trace(j.mycolor);
    }
    

    【讨论】:

    • @knuckfubuck 确实,这似乎与您想要的相反..对不起,刚起床。一分钟。
    • 感谢您再次浏览。这比我的原始代码更简洁,但它有一个问题。如果“for each”找不到不同的颜色,“while”可能会陷入无限循环。如果假设数组在循环结束附近留下了 4 个相同颜色的项目,就会发生这种情况。我正在编辑你的代码来解决这个问题。
    • 酷,很高兴我能帮上忙。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-06
    • 1970-01-01
    • 2021-04-24
    • 1970-01-01
    • 1970-01-01
    • 2016-11-25
    • 1970-01-01
    相关资源
    最近更新 更多