检查JS中的数组-列表是否排序?

时间:2018-12-18 12:35:14

标签: javascript arrays sorting

我需要创建一个程序来检查数组中的列表是否已排序。我有三个输入数据:

1,2,3,4,5

1,2,8,9,9

1,2,2,3,2

这是我的代码:

let sorts = +gets(); // 3
let list = [];

for (let i = 0; i < sorts; i++) {
    list[i] = gets().split(',').map(Number); // The Array will be: [ [ 1, 2, 3, 4, 5 ], [ 1, 2, 8, 9, 9 ], [ 1, 2, 2, 3, 2 ] ]
}

for (let i = 0; i < list[i][i].length; i++){
    if (list[i][i] < list[i][i +1]) {
        print('true');
    } else {
        print('false');
    }
}

我需要在新行上打印所有列表true或false。对于此示例,我的输出需要为:

true

true

false

我不知道该如何解决。

9 个答案:

答案 0 :(得分:17)

怎么样呢?

!![1,2,3,4,5].reduce((n, item) => n !== false && item >= n && item)
// true

!![1,2,8,9,9].reduce((n, item) => n !== false && item >= n && item)
// true 

!![1,2,2,3,2].reduce((n, item) => n !== false && item >= n && item)
// false

Reduce从字面上将数组减小为单个值-在我们的例子中为布尔值。

在这里,我们每次迭代都调用一个函数,(n, item)是我们的函数签名,它的主体是n !== false && item >- n && item-我们确保n存在(n是我们的累加器-阅读!),测试item是否大于n,并确保item存在。

这发生在数组中的每个元素上。然后,我们使用!!将结果强制为布尔值。

答案 1 :(得分:14)

您可以使用array#every检查每个值是否大于以前的值。

const isSorted = arr => arr.every((v,i,a) => !i || a[i-1] <= v);
console.log(isSorted([1,2,3,4,5]));
console.log(isSorted([1,2,8,9,9])); 
console.log(isSorted([1,2,2,3,2]));

答案 2 :(得分:8)

  

使用slice方法简单地尝试这种方法:它将检查上一个元素是否小于下一个元素。如果每个元素的条件为true,则返回true,否则返回false

arr.slice(1).every((item, i) => arr[i] <= item);

在下面的示例中将此示例签出

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

function isArrayIsSorted (arr) {
  return arr.slice(1).every((item, i) => arr[i] <= item)
}

var result= [];
for (var i = 0; i < arr.length; i++){
result.push(isArrayIsSorted(arr[i]))
}
console.log(result);

答案 3 :(得分:5)

var str = ["1,2,3,4,5", "1,2,8,9,9", "1,2,2,3,2"];

for (var i in str){
    var list = str[i].split(',').map(Number);
    console.log(list);
    var isSorted = true;
    for(var j = 0 ; j < list.length - 1 ; j++){
        if(list[j] > list[j+1]) {
            isSorted = false;
            break;
        }
    }
    console.log(isSorted);
}

答案 4 :(得分:3)

排序的号码列表

包括负数,零和相邻重复项

使用every()方法,如果所有数字顺序正确,则将返回true,否则将返回false。条件如下:

(num <= arr[idx + 1]) || (idx === arr.length - 1)
  1. 如果当前数字小于或等于下一个数字...

    或...

  2. 如果当前索引等于最后一个索引...

    return 1 (truthy)
    

演示

var arr0 = [1, 2, 3, 4, 5];
var arr1 = [1, 2, 8, 9, 9];
var arr2 = [1, 2, 2, 3, 2];
var arr3 = [0, 0, 0, 1, 3];
var arr4 = [-3, 0, 1, 3, 3];
var arr5 = [-4, -2, 0, 0, -4];

function sorted(array) {
  return array.every(function(num, idx, arr) {
    return (num <= arr[idx + 1]) || (idx === arr.length - 1) ? 1 : 0;
  });
}

console.log(arr0 +' | '+sorted(arr0));
console.log(arr1 +' | '+sorted(arr1));
console.log(arr2 +' | '+sorted(arr2));
console.log(arr3 +' | '+sorted(arr3));
console.log(arr4 +' | '+sorted(arr4));
console.log(arr5 +' | '+sorted(arr5));

答案 5 :(得分:0)

也许您可以使用此帮助方法来检查排序是否正确:

    var arr1 = [1, 2, 3, 4, 4];
    var arr2 = [3, 2, 1];

		console.log(checkList(arr1));
		console.log(checkList(arr2));
    
    function checkList(arr) {
        for (var i = 0; i < arr.length; i++) {
            if (arr[i + 1]) {
                if (arr[i] > arr[i + 1]) {
                    return false;
                }
            }

        }
        return true;
    }

答案 6 :(得分:0)

有很多方法可以做到这一点。这是我的

import { HttpClient } from '@angular/common/http';

答案 7 :(得分:0)

您可以检查原始数组的经字符串排序的副本是否与原始数组的值相同。可能不是最酷或性能最高的,但我喜欢它的简洁明了。

RefreshControl

答案 8 :(得分:-2)

如果我明白您的意思,那么您想知道数组是否已排序。这是此类解决方案的示例,请尝试一下。我在下面粘贴了一些代码。

var myArray=[1,4,3,6];

if(isSorted(myArray)){

    console.log("List is sorted");
}else{
    console.log("List is not sorted");
}

function isSorted(X){

var sorted=false;

for(var i=0;i<X.length;i++){

        var next=i+1;

    if (next<=X.length-1){

        if(X[i]>X[next]){
            sorted=false;
            break;
        }else{
            sorted=true;

        }
    }

}


return sorted;

}