我正在尝试对数组进行排序,以便所有的零都在最后。但是,我不希望列表按数字排序,所有高于零的数字应保持相同的顺序。这是我到目前为止所得到的:
function placeZerosAtEnd(arr) {
return arr.sort(compareForSort);
}
function compareForSort(first, second) {
return first == 0 ? 1 : 0;
}
placeZerosAtEnd([9,0,9,1,0,2,0,1,1,0,3,0,1,9,9,0,0,0,0,0]);
这应该返回[9,9,1,2,1,1,3,1,9,9,0,0,0,0,0,0,0,0,0,0],但实际上返回[3,9,9,1,9,2,9,1,1,1,0,0,0,0,0,0,0,0,0,0]。零是正确的,但其他数字是奇怪的顺序。这是怎么回事?
答案 0 :(得分:3)
正如其他人所说,在这种情况下使用.sort()是错误的。这是我最后使用的代码,正如elclanrs在我的初始帖子下面的评论中所建议的那样。
function placeZerosAtEnd(arr) {
return arr.filter(isntZero).concat(arr.filter(isZero));
}
function isntZero(element) {
return element > 0;
}
function isZero(element) {
return element == 0;
}
答案 1 :(得分:2)
我认为您无法使用sort
功能完成此操作。根据浏览器使用的排序方法(快速排序,合并排序等),sort
功能通过将项目交换到位来工作。所以没有人知道非零会在哪里结束......你的算法只是确保它们会出现在0之前。
这是一个可以完成你正在尝试的功能:
function placeZerosAtEnd(arr) {
for(var i = 0 ; i < arr.length ; i++) {
if(arr[i]===0) arr.splice(arr.length-1, 0, arr.splice(i, 1)[0]);
}
return arr;
}
答案 2 :(得分:0)
在您的示例中,sort
函数正在完成它的意图。
您期望stable sort
,但javascript排序算法无法保证稳定排序。
有关javascript中稳定排序的讨论,请参阅this question。
答案 3 :(得分:0)
你也可以用某种方式
var isntZero = []
var isZero =[]
for (var i = 0; i < this.listSort.length; i++) {
if(this.listSort[i] == 0){
isZero.push(this.listSort[i])
}else{
isntZero.push(this.listSort[i])
}
}
this.listSort = isntZero.concat(isZero)
答案 4 :(得分:0)
使用sort
的简单解决方案:将气泡“冒泡”到非零:
[9,0,9,1,0,2,0,1,1,0,3,0,1,9,9,0,0,0,0,0].sort((a, b) => {
if (a !== 0 && b === 0) return -1;
if (a === 0 && b !== 0) return 1;
return 0;
})
// [9, 9, 1, 2, 1, 1, 3, 1, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
答案 5 :(得分:0)
您可以使用arr.sort解决此问题
参考: Array.sort
function placeZerosAtEnd(arr) {
arr.sort(function(key1,key2) {
if (key1 == 0 ) return 1;
return -1;
});
return arr;
}