我有一个这样的字典:{a:0, b:1, c:2}
。实际上,字段名称和表中的顺序。我需要采用这种结构,以便(例如)如果b的位置变为0,则结果为{b:0, a:1, c:2}
。如果b的位置变为2,则结果必须为{a:0, c:1, b:2}
,依此类推......
如何做到这一点?我不能使用内置函数(如果有的话),因为该字典中的每个字段都取自更复杂的结构。我基本上只能迭代这个字典,排序与否,并改变位置值。
我使用的是Javascript / Coffeescript,但这没关系 - 我会欣赏任何语言的想法。
答案 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]
}
}