移动元素在由元素组成的字典中:位置对

时间:2013-10-24 07:15:46

标签: javascript algorithm sorting data-structures dictionary

我有一个这样的字典:{a:0, b:1, c:2}。实际上,字段名称和表中的顺序。我需要采用这种结构,以便(例如)如果b的位置变为0,则结果为{b:0, a:1, c:2}。如果b的位置变为2,则结果必须为{a:0, c:1, b:2},依此类推......

如何做到这一点?我不能使用内置函数(如果有的话),因为该字典中的每个字段都取自更复杂的结构。我基本上只能迭代这个字典,排序与否,并改变位置值。

我使用的是Javascript / Coffeescript,但这没关系 - 我会欣赏任何语言的想法。

2 个答案:

答案 0 :(得分:2)

考虑需要发生什么:如果将某个值从n阶移动到n阶,则只有n阶和n阶之间的值的顺序实际上会发生变化。如果n> n',它们向下移动一个,如果n<他们向上移动一个。这是一些伪代码:

function(dict, name, newOrder)
{
    var oldOrder = dict[name];
    foreach((k, order) in dict)
    {
        if(order > oldOrder && order <= newOrder)
            dict[k]--;
        else if(order >= newOrder && order < oldOrder)
            dict[k]++;
    }
    dict[name] = newOrder;
}

答案 1 :(得分:1)

这是一个不会迭代地图中所有元素的解决方案 这很复杂,我认为它不会提高小数据集的速度 抱歉,这不是正确的javascript:

add = function(dict, vector, k)
{
    var size=len(vector);
    vector[size]=k;
    dict[k]=size;
}
swap(dict, vector, name, newOrder)
{   
    var oldOrder = dict[name]
    if(oldOrder < newOrder)
    {
        for(var i=oldOrder+1; i<=newOrder; i++)
        {  dict[vector[i]]--;
           vector[i-1]=vector[i];
        }
        dict[name]=newOrder;
        vector[newOrder]=dict[name]
    }
    else
    {
        for(var i=oldOrder-1; i>=newOrder; i--)
        {  dict[vector[i]]++;
           vector[i+1]=vector[i];
        }
        dict[name]=newOrder;
        vector[newOrder]=dict[name]
    }
}

说明:

add = function(dict, vector, k)
{
    var size=len(vector);
    vector[size]=k;
    dict[k]=size;
}
// vector: 0a 1b 2c 3d 4e
// map: a0 b1 c2 d3 e4

swap(dict, vector, name, newOrder)
{   
    // newOrder = 4

    var oldOrder = dict[name]
    // oldOrder = 1

    if(oldOrder < newOrder)
    {   
        // goes here
        for(var i=oldOrder+1; i<=newOrder; i++)
        {  
           // map: a0 b1 c2 d3 e4
           dict[vector[i]]--;
           // map: a0 b1 c1 d3 e4 //after one iteration

           // vector: 0a 1b 2c 3d 4e
           vector[i-1]=vector[i];
           // vector: 0a 1c 2c 3d 4e //after one iteration

        }
        // map: a0 b1 c1 d2 e3             
     // vector: 0a 1c 2d 3e 4e

        dict[name]=newOrder;
        vector[newOrder]=dict[name]

        // map: a0 b4 c1 d2 e3             
     // vector: 0a 1c 2d 3e 4b
    }
    else
    {
        for(var i=oldOrder-1; i>=newOrder; i--)
        {  dict[vector[i]]++;
           vector[i+1]=vector[i];
        }
        dict[name]=newOrder;
        vector[newOrder]=dict[name]
    }
}