首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将连续数字合并到排序的数字列表中?

如何将连续数字合并到排序的数字列表中?
EN

Stack Overflow用户
提问于 2019-05-16 16:48:24
回答 2查看 1.4K关注 0票数 3

我想用一个可读的字符串连接一个数字序列。连续的数字应该像这个'1-4'一样合并。

我能够将一个数组与所有数字连接到一个完整的字符串中,但是我很难组合/合并连续的数字。

我尝试将前面和下一个值与循环中的当前值与几个if-conditions进行比较,但似乎找不到合适的值来使其正常工作。

示例:

代码语言:javascript
复制
if(ar[i-1] === ar[i]-1){}
if(ar[i+1] === ar[i]+1){}

我的代码如下所示:

代码语言:javascript
复制
var ar = [1,2,3,4,7,8,9,13,16,17];

var pages = ar[0];
var lastValue = ar[0];

for(i=1; i < ar.length; i++){
      if(ar[i]-1 === lastValue){
          pages = pages + ' - ' + ar[i];
      }else{
          pages = pages + ', ' + ar[i];
      }
}

alert(pages);

结果是:1 - 2, 3, 4, 7, 8, 9, 13, 16, 17

最后,应该是这样的:1-4, 7-9, 13, 16-17

编辑:我的脚本使用了@CMS链接上的第一个答案。看起来很像@corschdi片段的更短版本:

代码语言:javascript
复制
var ar = [1,2,3,4,7,8,9,13,16,17];


var getRanges = function(array) {
  var ranges = [], rstart, rend;
  for (var i = 0; i < array.length; i++) {
    rstart = array[i];
    rend = rstart;
    while (array[i + 1] - array[i] == 1) {
      rend = array[i + 1]; // increment the index if the numbers sequential
      i++;
    }
    ranges.push(rstart == rend ? rstart+'' : rstart + '-' + rend);
  }
  return ranges;
}


alert(getRanges(ar));

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-05-16 18:16:12

这应该是可行的:

代码语言:javascript
复制
var array = [1, 2, 3, 4, 7, 8, 9, 13, 16, 17];

var ranges = [];
var index = 0;
while (index < array.length) {
    var rangeStartIndex = index;
    while (array[index + 1] === array[index] + 1) {
        // continue until the range ends
        index++;
    }

    if (rangeStartIndex === index) {
        ranges.push(array[index]);
    } else {
        ranges.push(array[rangeStartIndex] + " - " + array[index]);
    }
    index++;
}

console.log(ranges.join(", "));

票数 0
EN

Stack Overflow用户

发布于 2019-05-16 17:00:04

在您的代码中,lastValue不会在循环中发生变化,因此您将永远与数组中的第一个元素进行比较。而且,当您找到匹配时,您还没有准备好添加到pages结果中--可能还会有更多的数字。

一种方法可能是保持当前数字序列的运行(或者只是运行中的第一个和最后一个数字),并且只在我们发现序列中出现中断或到达字符串末尾时将此运行追加到结果字符串中。

有很多方法来解决这个问题,我建议在代码战:距离提取 kata上检查其他人的答案,它(几乎)与这个问题相同。

这是我的解决方案:

代码语言:javascript
复制
const rangeify = a => {
  const res = [];
  let run = []
  
  for (let i = 0; i < a.length; i++) {
    run.push(a[i]);

    if (i + 1 >= a.length || a[i+1] - a[i] > 1) {
      res.push(
        run.length > 1 ? `${run[0]}-${run.pop()}` : run
      );
      run = [];
    }
  }
  
  return res.join(", ");
};

[
  [1,2,3,4,7,8,9,13,16,17],
  [],
  [1],
  [1, 2],
  [1, 3],
  [1, 2, 3, 8],
  [1, 3, 4, 8],
  [1, 1, 1, 1, 2, 3, 4, 5, 5, 16],
  [-9, -8, -7, -3, -1, 0, 1, 2, 42]
].forEach(test => console.log(rangeify(test)));

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56173207

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档