鍍金池/ 問(wèn)答/PHP/ 數(shù)據(jù)排序問(wèn)題

數(shù)據(jù)排序問(wèn)題

有一個(gè)排序需求,需要實(shí)現(xiàn):當(dāng)前數(shù)據(jù)往后移動(dòng)N位或者向前移動(dòng)N位。想了半天,沒(méi)想到好的解決辦法。

操作對(duì)象是數(shù)據(jù)庫(kù)一條數(shù)據(jù)

希望能在損耗最少的情況下,實(shí)現(xiàn)

回答
編輯回答
情已空

js可能如下處理:

const array = [1, 2, 4, 5, 6, 7, 8, 9, 3, 10];

const arrayMoveTo = (arr, start, end) => {
  if(start > arr.length || end > arr.length || start < 1 || end < 1) {
    throw new Error('');
  }
  const temp = arr.splice(start - 1, 1)[0];
  arr.splice(end - 1, 0, temp);
  return arr;
};

console.log(arrayMoveTo(array, 9, 3));
//[ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ]
2018年8月3日 20:20
編輯回答
舊酒館

哈哈哈 今天剛好看到這種提 這個(gè)叫做旋轉(zhuǎn)數(shù)組 我發(fā)發(fā)發(fā) 很簡(jiǎn)便的代碼 忘采納哦 最近才開(kāi)始玩 需要刷點(diǎn)分

var numArr = [1,2,3,4,5,6,7]
var rotate = function(nums, k) {
    var a = nums.splice(-k,k)
    nums.unshift(...a)
    return nums
}
var rotate2 = function(nums, k) {
    nums.splice(0,0,...nums.splice(-k,k))
    return nums
}
2018年2月13日 05:03
編輯回答
脾氣硬

核心思想是將數(shù)組依據(jù)原始位置和新位置”切割“成幾部分,調(diào)整位置后重新合并,不涉及排序。
并且,我給的方案能左移也能右移動(dòng)

PS. 看到題目變更,目標(biāo)是數(shù)據(jù)庫(kù),欲哭無(wú)淚!

var arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];

/**
i: 目標(biāo)元素的index
steps: 移動(dòng)步數(shù),正數(shù)向右移動(dòng),負(fù)數(shù)向左移動(dòng)
inArray: 目標(biāo)數(shù)組
*/
function moveStepsInArray(i, steps, inArray) {
    if(i<0 || i>inArray.length - 1 || steps === 0) {
        return inArray;
    }
    var newPosition = i + steps;

    if(newPosition < 0) {
        newPosition = 0;
    }
    if(newPosition > inArray.length - 1) {
        newPosition = inArray.length - 1;
    }

    var front = steps > 0 ? i: newPosition;
    var after = steps > 0 ? newPosition: i;

    var targetVal = inArray[i];

    if(steps > 0) {
        return inArray.slice(0, front)
            .concat(inArray.slice(front + 1, after + 1))
            .concat([targetVal])
            .concat(inArray.slice(after + 1)) 
    }

    if(steps < 0) {
        return inArray.slice(0, front)
            .concat([targetVal])
            .concat(inArray.slice(front, after))
            .concat(inArray.slice(after + 1));
    }
}

moveStepsInArray(4, -3, arr); //將arr中的第4個(gè)元素向左移動(dòng)3步
2017年12月16日 13:17
編輯回答
刮刮樂(lè)

獲取排序前的位置a,和排序后的位置b
如果a > b(往前移),只要重排b-a
如果a < b(往后移),只要重排a-b

2017年5月19日 22:55
編輯回答
帥到炸

設(shè)每個(gè)數(shù)據(jù)項(xiàng)都有一個(gè)屬性 ORDER,范圍 0.000001.00000,移動(dòng)或者插入任意一個(gè)節(jié)點(diǎn),前后 ORDER 可被無(wú)限分段,其他已有節(jié)點(diǎn)不受影響,分段值可直接計(jì)算。

2017年2月16日 16:47