回答
如果你只是想表示一个范围内的字符串,那么你会发现你的序列的中点,并(在你的例子10)成为你的中间值。然后,您会抓取序列中的第一个项目以及紧接在中点之前的项目,并构建您的第一个序列表示。你可以按照相同的步骤获得最后一个项目,以及紧接在中间点之后的项目,并建立最后一个序列的表示。
// Provide initial sequence
var sequence = [1,2,3,4,5,6,7,8,9,10];
// Find midpoint
var midpoint = Math.ceil(sequence.length/2);
// Build first sequence from midpoint
var firstSequence = sequence[0] + "-" + sequence[midpoint-2];
// Build second sequence from midpoint
var lastSequence = sequence[midpoint] + "-" + sequence[sequence.length-1];
// Place all new in array
var newArray = [firstSequence,midpoint,lastSequence];
alert(newArray.join(",")); // 1-4,5,6-10
输出不是1-10,因为数字1-10依次出现而没有丢失? – 2010-02-16 07:53:56
你可以遍历号码,看看接下来的数大于1,则当前数目。所以有一个:
struct range {
int start;
int end;
} range;
其中如果array[i+1] == array[i]+1;
(其中,i是当前观察到的数目) 然后range.end = array[i+1];
。然后你进入下一个i
;如果array[i+1] != array[i]+1;
然后range.end = array[i];
你可以存储范围在vector<range> ranges;
印刷很容易:
for(int i = 0; i < ranges.size(); i++) {
range rng = (range)ranges.at(i);
printf("[%i-%i]", rng.start, rng.end);
}
; For all cells of the array
;if current cell = prev cell + 1 -> range continues
;if current cell != prev cell + 1 -> range ended
int[] x = [2,3,4,5,10,18,19,20]
string output = '['+x[0]
bool range = false; --current range
for (int i = 1; i > x[].length; i++) {
if (x[i+1] = [x]+1) {
range = true;
} else { //not sequential
if range = true
output = output || '-'
else
output = output || ','
output.append(x[i]','||x[i+1])
range = false;
}
}
类似的东西。
这是一种算法,我做了some time ago,最初是为C#写的,现在我把它移植到JavaScript的:
function getRanges(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;
}
getRanges([2,3,4,5,10,18,19,20]);
// returns ["2-5", "10", "18-20"]
getRanges([1,2,3,5,7,9,10,11,12,14 ]);
// returns ["1-3", "5", "7", "9-12", "14"]
getRanges([1,2,3,4,5,6,7,8,9,10])
// returns ["1-10"]
会建议先排序值,所以你可以处理混合值,如:[1,3,2,6,5,7] – Tracker1 2010-02-16 07:57:39
我把它放在npm https://www.npmjs.com/package/get-范围 – 2016-09-17 08:40:32
这里是一个Perl的一个版本:
use strict;
use warnings;
my @numbers = (0,1,3,3,3,4,4,7,8,9,12, 14, 15, 19, 35, 35, 37, 38, 38, 39);
@numbers = sort {$a <=> $b} @numbers ; # Make sure array is sorted.
# Add "infinity" to the end of the array.
$numbers[1+$#numbers] = undef ;
my @ranges =() ; # An array where the range strings are stored.
my $start_number = undef ;
my $last_number = undef ;
foreach my $current_number (@numbers)
{
if (!defined($start_number))
{
$start_number = $current_number ;
$last_number = $current_number ;
}
else
{
if (defined($current_number) && (($last_number + 1) >= $current_number))
{
$last_number = $current_number ;
next ;
}
else
{
if ($start_number == $last_number)
{
push(@ranges, $start_number) ;
}
else
{
push(@ranges, "$start_number-$last_number") ;
}
$start_number = $current_number ;
$last_number = $current_number ;
}
}
}
# Print the results
print join(", ", @ranges) . "\n" ;
# Returns "0-1, 3-4, 7-9, 12, 14-15, 19, 35, 37-39"
来自PerlMonks的较短答案:[http://www.perlmonks.org/?node_id=87538](http://www.perlmonks.org/?node_id=87538) – 2011-09-09 20:27:17
只要有乐趣来自CMS的解决方案:
function getRanges (array) {
for (var ranges = [], rend, i = 0; i < array.length;) {
ranges.push ((rend = array[i]) + ((function (rstart) {
while (++rend === array[++i]);
return --rend === rstart;
})(rend) ? '' : '-' + rend));
}
return ranges;
}
++ for trick while循环。顺便说一句,这是相等的。函数getRanges(c){for(var b = [],a,d = 0; d
下面是我对此的看法...
function getRanges(input) {
//setup the return value
var ret = [], ary, first, last;
//copy and sort
var ary = input.concat([]);
ary.sort(function(a,b){
return Number(a) - Number(b);
});
//iterate through the array
for (var i=0; i<ary.length; i++) {
//set the first and last value, to the current iteration
first = last = ary[i];
//while within the range, increment
while (ary[i+1] == last+1) {
last++;
i++;
}
//push the current set into the return value
ret.push(first == last ? first : first + "-" + last);
}
//return the response array.
return ret;
}
我只是在寻找这个确切的东西。我需要一个PHP版本,以便移植CMS的解决方案。这是任何人谁被这个问题寻找同样的事情停止:
function getRanges($nums)
{
$ranges = array();
for ($i = 0, $len = count($nums); $i < $len; $i++)
{
$rStart = $nums[$i];
$rEnd = $rStart;
while (isset($nums[$i+1]) && $nums[$i+1]-$nums[$i] == 1)
$rEnd = $nums[++$i];
$ranges[] = $rStart == $rEnd ? $rStart : $rStart.'-'.$rEnd;
}
return $ranges;
}
我发现这个答案是有用的,但需要一个Python版本:
def GroupRanges(items):
"""Yields 2-tuples of (start, end) ranges from a sequence of numbers.
Args:
items: an iterable of numbers, sorted ascendingly and without duplicates.
Yields:
2-tuples of (start, end) ranges. start and end will be the same
for ranges of 1 number
"""
myiter = iter(items)
start = myiter.next()
end = start
for num in myiter:
if num == end + 1:
end = num
else:
yield (start, end)
start = num
end = num
yield (start, end)
numbers = [1, 2, 3, 5, 6, 7, 8, 9, 10, 20]
assert [(1, 3), (5, 10), (20, 20)] == list(GroupRanges(numbers))
assert [(1, 1)] == list(GroupRanges([1]))
assert [(1, 10)] == list(GroupRanges([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]))
PHP
function getRanges($nums) {
sort($nums);
$ranges = array();
for ($i = 0, $len = count($nums); $i < $len; $i++)
{
$rStart = $nums[$i];
$rEnd = $rStart;
while (isset($nums[$i+1]) && $nums[$i+1]-$nums[$i] == 1)
$rEnd = $nums[++$i];
$ranges[] = $rStart == $rEnd ? $rStart : $rStart.'-'.$rEnd;
}
return $ranges;
}
echo print_r(getRanges(array(2,21,3,4,5,10,18,19,20)));
echo print_r(getRanges(array(1,2,3,4,5,6,7,8,9,10)));
除非将可选的第二个参数设置为true,否则print_r已经打印到stdout:echo print_r(array(),true);或者只是print_r(array()); – 2012-07-18 22:00:19
import java.util.ArrayList;
import java.util.Arrays;
public class SequencetoRange {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
int num[] = {1,2,3,63,65,66,67,68,69,70,80,90,91,94,95,4,101,102,75,76,71};
int l = num.length;
int i;
System.out.print("Given number : ");
for (i = 0;i < l;i++){
System.out.print(" " + num[i]);
}
System.out.println("\n");
Arrays.sort(num);
ArrayList newArray = new ArrayList();
newArray = getRanges(num);
System.out.print("Range : ");
for(int y=0;y<newArray.size();y++)
{
System.out.print(" " +newArray.get(y));
}
}
public static ArrayList getRanges(int num[])
{
ArrayList ranges = new ArrayList();
int rstart, rend;
int lastnum = num[num.length-1];
for (int i = 0; i < num.length-1; i++)
{
rstart = num[i];
rend = rstart;
while (num[i + 1] - num[i] == 1)
{
rend = num[i + 1];
// increment the index if the numbers sequential
if(rend>=lastnum)
{
break;
}
else
{
i++;
}
}
if(rstart==rend)
{
ranges.add(rend);
}
else
{
ranges.add(+rstart+"..."+rend);
}
}
return ranges;
}
}
在C#中
public string compressNumberRange(string inputSeq)
{
//Convert String array to long List and removing the duplicates
List<long> longList = inputSeq.Split(',').ToList().ConvertAll<long>(s => Convert.ToInt64(s)).Distinct().ToList();
//Sort the array
longList.Sort();
StringBuilder builder = new StringBuilder();
for (int itr = 0; itr < longList.Count(); itr++)
{
long first = longList[itr];
long end = first;
while (longList[itr + 1] - longList[itr] == 1) //Seq check
{
end = longList[itr + 1];
itr++;
if (itr == longList.Count() - 1)
break;
}
if (first == end) //not seq
builder.Append(first.ToString() + ",");
else //seq
builder.Append(first.ToString() + "-" + end.ToString() + ",");
}
return builder.ToString();
}
我写我自己的方法,这是依赖于罗短跑,但不只是给你回的范围数组,相反,它只是返回范围组的阵列。
[1,2,3,4,6,8,10]变为:
[[1,2,3,4],[6,8,10]]
下面是CMS的代码BASH端口:
#!/usr/bin/env bash
# vim: set ts=3 sts=48 sw=3 cc=76 et fdm=marker: # **** IGNORE ******
get_range() { RANGE= # <-- OUTPUT **** THIS ******
local rstart rend i arr=("[email protected]") # ported from **** JUNK ******
for ((i=0 ; i < $# ; i++)); do # http://stackoverflow.com
((rstart = arr[i])) # /a/2270987/912236
rend=$rstart; while ((arr[i+1] - arr[i] == 1)); do
((rend = arr[++i])); done; ((rstart == rend)) &&
RANGE+=" $rstart" || RANGE+=" $rstart-$rend"; done; } # }}}
冷聚变
的CMS's javascript solution适应它首先做排序的列表,以便1,3,2,4,5,8,9,10
(或类似)正确转换为1-5,8-10
。
<cfscript>
function getRanges(nArr) {
arguments.nArr = listToArray(listSort(arguments.nArr,"numeric"));
var ranges = [];
var rstart = "";
var rend = "";
for (local.i = 1; i <= ArrayLen(arguments.nArr); i++) {
rstart = arguments.nArr[i];
rend = rstart;
while (i < ArrayLen(arguments.nArr) and (val(arguments.nArr[i + 1]) - val(arguments.nArr[i])) == 1) {
rend = val(arguments.nArr[i + 1]); // increment the index if the numbers sequential
i++;
}
ArrayAppend(ranges,rstart == rend ? rstart : rstart & '-' & rend);
}
return arraytolist(ranges);
}
</cfscript>
谢谢...我写了一个类似的UDF,但它遭受了一个错误。我更新了这个,所以它会接受一个列表或数组,并在尝试数字排序之前添加一个子例程来修剪和删除非数字项目。 (如果没有为用户提供的值执行此操作,则可能会引发错误。) – 2016-08-25 15:16:01
非常好的问题:这是我的尝试:
function ranges(numbers){
var sorted = numbers.sort(function(a,b){return a-b;});
var first = sorted.shift();
return sorted.reduce(function(ranges, num){
if(num - ranges[0][1] <= 1){
ranges[0][1] = num;
} else {
ranges.unshift([num,num]);
}
return ranges;
},[[first,first]]).map(function(ranges){
return ranges[0] === ranges[1] ?
ranges[0].toString() : ranges.join('-');
}).reverse();
}
这是我放在一起的斯威夫特。它首先消除重复并对数组进行排序,并不介意它是否给出了一个空数组或一个数组。
func intArrayToString(array: [Int]) -> String {
var intArray = Array(Set(array))
intArray.sortInPlace()
if intArray.count == 0 {
return ""
}
var intString = "\(intArray[0])"
if intArray.count > 1 {
for j in 1..<intArray.count-1 {
if intArray[j] == intArray[j-1]+1 {
if intArray[j] != intArray[j+1]-1 {
intString += "-\(intArray[j])"
}
} else {
intString += ",\(intArray[j])"
}
}
if intArray.last! == intArray[intArray.count-2]+1 {
intString += "-\(intArray.last!)"
} else {
intString += ",\(intArray.last!)"
}
}
return intString
}
微小的ES6模块为你们。它接受一个函数来确定我们什么时候必须破坏序列(breakDetectorFunc param - 默认是整数序列输入的简单事情)。 注意:由于输入是抽象的 - 有没有自动分拣处理之前,因此,如果您的序列是没有排序 - 在调用该模块
function defaultIntDetector(a, b){
return Math.abs(b - a) > 1;
}
/**
* @param {Array} valuesArray
* @param {Boolean} [allArraysResult=false] if true - [1,2,3,7] will return [[1,3], [7,7]]. Otherwise [[1.3], 7]
* @param {SequenceToIntervalsBreakDetector} [breakDetectorFunc] must return true if value1 and value2 can't be in one sequence (if we need a gap here)
* @return {Array}
*/
const sequenceToIntervals = function (valuesArray, allArraysResult, breakDetectorFunc) {
if (!breakDetectorFunc){
breakDetectorFunc = defaultIntDetector;
}
if (typeof(allArraysResult) === 'undefined'){
allArraysResult = false;
}
const intervals = [];
let from = 0, to;
if (valuesArray instanceof Array) {
const cnt = valuesArray.length;
for (let i = 0; i < cnt; i++) {
to = i;
if (i < cnt - 1) { // i is not last (to compare to next)
if (breakDetectorFunc(valuesArray[i], valuesArray[i + 1])) {
// break
appendLastResult();
}
}
}
appendLastResult();
} else {
throw new Error("input is not an Array");
}
function appendLastResult(){
if (isFinite(from) && isFinite(to)) {
const vFrom = valuesArray[from];
const vTo = valuesArray[to];
if (from === to) {
intervals.push(
allArraysResult
? [vFrom, vTo] // same values array item
: vFrom // just a value, no array
);
} else if (Math.abs(from - to) === 1) { // sibling items
if (allArraysResult) {
intervals.push([vFrom, vFrom]);
intervals.push([vTo, vTo]);
} else {
intervals.push(vFrom, vTo);
}
} else {
intervals.push([vFrom, vTo]); // true interval
}
from = to + 1;
}
}
return intervals;
};
module.exports = sequenceToIntervals;
/** @callback SequenceToIntervalsBreakDetector
@param value1
@param value2
@return bool
*/
第一个参数做到这一点是输入序列排序后的数组,第二个是一布尔标志控制输出模式:如果为真 - 单个项目(间隔外)将被反正返回数组:[1,7],[9,9],[10,10],[12,20],否则单品返回它们出现的输入数组
在为您的样品输入
[2,3,4,5,10,18,19,20]
则回复:
sequenceToIntervals([2,3,4,5,10,18,19,20], true) // [[2,5], [10,10], [18,20]]
sequenceToIntervals([2,3,4,5,10,18,19,20], false) // [[2,5], 10, [18,20]]
sequenceToIntervals([2,3,4,5,10,18,19,20]) // [[2,5], 10, [18,20]]
- 1. 将数字转换为数字范围?
- 2. SQL将一列数字转换为一列中的范围
- 3. 如何将数字范围的字符串转换为Python中的列表
- 4. 如何将字符串列表转换为数字numpy数组?
- 5. 将随机字节转换为整数范围 - 如何?
- 6. 如何将字数转换为数字
- 7. 如何将数字范围从0-200转换为1-5范围
- 8. 如何将Java字节数组转换为Scala字节数组?
- 9. 如何将字节数组转换为字符串数组?
- 10. 如何将字符串数组转换为BigQuery中的数组?
- 11. 如何将整数转换为C中的数字数组?
- 12. 如何将字典数组转换为数组数组?
- 13. Python:如何将字符串数组转换为数组数组?
- 14. 将整数转换为数组数字
- 15. 如何将序列化的数组字符串转换为数组?
- 16. 如何将数组转换为字符串数组在android中
- 17. 如何将一串数字转换为数组数组?
- 18. 如何将字符串数组转换为整数数组?
- 19. 如何将数组列表转换为Javascript中的字符串?
- 20. 如何将字符数组转换为kdb中的列表
- 21. 将数组数组转换为angularjs中的字符串数组
- 22. 如何在MATLAB中将数字范围连接到数组中?
- 23. 如何显示数组并将数字转换为字符串?
- 24. 将字符数组转换为整数
- 25. 将字符数组转换为整数
- 26. 将字符数组转换为整数
- 27. 如何将数字串转换为java中的int数组
- 28. 如何将数组的JavaScript字符串转换为数组?
- 29. 如何将降压范围转换为数组?
- 30. 将整数转换为组合框中的数字列表 - C#
你是如何确定享受一系列的开始和结束? – Sampson 2010-02-16 05:45:43
@gokul:我编辑你的问题(从标题删除例如,格式化的正文)。您可以通过正确设置问题来激励人们提供帮助。 – 2010-02-16 05:45:47