2013-10-24 81 views
0

我有這樣的字典:{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

所以如果你有'k'項,那麼你就只能從有值'0'到'K-1'? – titus

+0

是的。最好。無論如何,我可以通過索引對結構進行排序,然後遍歷它並將i ++作爲一個位置,以使1,2,5變爲0,1,2(例如)。但是如果這可以在第一次(也是唯一)的迭代中完成,那會更好。 – DEgorov

+0

'k'的數量級是多少?需要多久調用一次該函數? – titus

回答

2

考慮需要發生什麼:如果將某個值從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; 
} 
+0

非常感謝!適應了一下,問題就解決了。 – DEgorov

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] 
    } 
}