2016-06-26 17 views
1

文字列の配列を長さで並べ替える必要があります。文字列の長さが同じであれば、元の順序で並べ替える必要があります。これは私のコードです:Javascript長さの不安定さによる配列の並べ替え

arr.sort(function(a, b) { 
    return b.length - a.length; 
}); 

それは> 10と同じ長さの要素の数まで動作しますが、その後のソート方法における不安定性が順序を変更します。私は同じ順序を保つ方法を見つけることを試みたが、私は運がない。助言がありますか?

+2

安定性は、ソートアルゴリズムのプロパティです。 Javascript 'sort'は**安定していないので、最初に新しい配列' arr2'を '(el、i)'で作成することで対処しなければなりません。ここで 'el'は' arr'の位置'i'を実行し、これらのペアを辞書順にソートし、最後に2番目の' i'要素を削除します。あるいは、独自の安定したソートアルゴリズム(例えば、マージソート)を書くこともできます。 – Bakuriu

+0

http://stackoverflow.com/questions/1427608/fast-stable-sorting-algorithm-implementation-in-javascript – elclanrs

+0

安定したソートアルゴリズムを手動で実装するだけです。 – Oriol

答えて

1

実際の要素の代わりに(element, index)のペアをソートする必要があります。このようにすれば、安定した並べ替えができます。

0

sorting with mapを使用できます。マップには元の並べ替えの長さとインデックスが含まれています。

// the array to be sorted 
 
var stringArray = ['Tom', 'Mia', 'Michael', 'Bob', 'Thomas', 'Joy']; 
 

 
// temporary array holds objects with position and sort-value 
 
var mapped = stringArray.map(function (el, i) { 
 
    return { index: i, value: el.length }; 
 
}); 
 

 
// sorting the mapped array containing the reduced values 
 
mapped.sort(function (a, b) { 
 
    return b.value - a.value || a.index - b.index; 
 
}); 
 

 
// container for the resulting order 
 
var result = mapped.map(function (el) { 
 
    return stringArray[el.index]; 
 
}); 
 

 
console.log(result);

0
arr.map(function(str, i){ 
    return { 
     index: i, 
     length: str.length, 
     value: str 
    } 
}).sort(function(a, b){ 
    return b.length - a.length || a.index - b.index; 
}).map(function(obj){ 
    return obj.value; 
}) 

これは、多くのオーバーヘッドのように見えるかもしれませんが、できるだけ早くあなたが何らかの形であなたがソートされている値を計算する必要があるとして、それは一度それを計算し、それを保存するために高速です潜在的に*(n-1)回の操作でそれを計算するよりも、いくつかのオブジェクトです。

このソート方法は、しばしばパフォーマンスの高い方法です。

それとも、2つのマッピング・タスクをgenerallize:

var valueIndex = function(value,index){ return {value:value,index:index} }; 
var getValue = function(obj){ return obj.value }; 

arr.map(valueIndex) 
    .sort(function(a, b){ 
     return b.value.length - a.value.length || a.index - b.index 
    }) 
    .map(getValue); 

ES6

var valueIndex = (value,index) => { return {value,index} }; 
var getValue = ({value}) => value; 

arr.map(valueIndex) 
    .sort((a, b) => b.value.length - a.value.length || a.index - b.index) 
    .map(getValue); 
関連する問題