Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 有什么聪明的方法可以输出包含n个项目的列表,中间有(n-1)个分隔符?_Algorithm_Language Agnostic_Optimization_Implementation - Fatal编程技术网

Algorithm 有什么聪明的方法可以输出包含n个项目的列表,中间有(n-1)个分隔符?

Algorithm 有什么聪明的方法可以输出包含n个项目的列表,中间有(n-1)个分隔符?,algorithm,language-agnostic,optimization,implementation,Algorithm,Language Agnostic,Optimization,Implementation,假设我们有一个包含n个元素的数组(n>0) 我们希望输出这些元素的列表,它们之间有一个分隔符 解决此问题的常用方法是: foreach item ( output item output separator ) trim last separator 但这样做似乎有点麻烦 另一种办法是: check that there is at least one element loop ( output element next element, or

假设我们有一个包含n个元素的数组(n>0)

我们希望输出这些元素的列表,它们之间有一个分隔符

解决此问题的常用方法是:

foreach item
  (
    output item
    output separator
  )
trim last separator
但这样做似乎有点麻烦

另一种办法是:

check that there is at least one element
loop
  (
     output element
     next element, or break if no more elements
     output separator
  )
但我不确定它是否会一直起作用

<>你看到其他聪明的方法吗?例如,在C,C++ + < /P> <代码>中(i=0;ifor (i = 0; i < n; ++i) switch(i) { default: output_separator(); case 0: output_item(i); } 默认值:输出分隔符(); 案例0:输出_项(i); } 或是这方面的变化。我真的想不出还有什么办法不重复
输出项目(I)

有时:

output item 0
for item 1 to n
{
    output separator
    output item
}

比较短。

我总是使用第一项检查习惯用法。以下是java中的代码:

List<Object> list;
if (list.size() > 0) {
   put(list.get(0));
}
for(int i = 1; i < list.size(); i++) {
   putSeparator();
   put(list.get(i));                                
}
列表;
如果(list.size()>0){
put(list.get(0));
}
对于(int i=1;i
char*sep=“”;
对于(i=0;i
由于它被标记为语言不可知论者,我认为有必要指出的是,有些语言具有内置功能,让您甚至不用考虑这个问题。以这段python代码为例:

>>> print string.join(['list', 'of', 'some', 'words'], ', ')
list, of, some, words

在CommonLisp中,只要您可以硬编码分隔符,它就近乎简单

(defun return-delimited-list (list &optional stream)
  (format stream "~{~A~^, ~}" list))

调用时,返回一个字符串,该字符串由
列表中的元素组成,以“,”分隔(最后一个元素后面不跟任何东西除外)。如果输出一个输出流,它会把它打印到流中,这正好是“nIL”的意思是“没有流,只返回一个字符串”。

< P>一个可能的C++解决方案:

摘要:编写一个
infix\u ostream\u迭代器
,它与
ostream\u迭代器
基本相同,只是“separator”参数实际上是一个分隔符,而不是每个项的后缀。然后,使用情况将是:

std::copy(first, last, infix_ostream_iterator<ItemType>(output, separator));
std::copy(第一个、最后一个、中缀或中缀迭代器(输出、分隔符));

此版本避免了任何附加分支:

int i = 0;
goto skip_delim;
do {
               put_delim();
   skip_delim: put_el(i++);
} while (i < size);
inti=0;
去跳绳;
做{
放在桌子上;
skip_delim:put_el(i++);
}而(i

(对于那些害怕跳转的人,可以使用达夫设备的方法编写)

无论好坏,我都使用计数循环,使用

for (i = 0; i < num_items; i++){
  if (i > 0) output separator;
  output item[i];
}
for(i=0;i0)输出分隔符;
产出项目[一];
}
我相信这是过时的下流诱饵,但它是有效的

如果有人想告诉我这是低效的,孩子,我是否准备好了火焰;-)

Haskell中的“第一次检查”成语:

intersperse :: Show a => String -> [a] -> String
intersperse _ [] = ""
intersperse s (x:xs) = show x ++ concatMap ((s ++) . show) xs
它是这样使用的:

*Main> intersperse "," [1,2,3]
"1,2,3"
*Main> intersperse "," [1]
"1"
*Main> intersperse ";" [1,2]
"1;2"
*Main> intersperse "," []
""


我没有发现任何重复的,但可能有。搜索词不容易找到。这与其说是算法问题,不如说是实现问题。没错。我添加了标记,谢谢。根据@benoit的请求,我怀疑任何东西都不能打败你的第二个approach.wiki。在
0
之前缺少一个
case
这看起来它将输出0,然后是n-1分隔符。@Geoffrey-在C中,
开关有隐含的故障。您必须明确地
中断
以防止出错。与达夫的设备()类似,但违规程度较低。换言之,这值得投票,但我不确定是向上还是向下(我跟着向上)。@lijie-我完全不只是写了一个通用版本,其中包含指向打印函数的指针和一个
void*
。数组长度和元素大小有两个
size\t
s。我认为他的问题类似于问连接方法是如何实现的。@杰弗里:我不同意,它与语言无关,因此连接解决方案不仅应该包括在内,而且应该突出显示。我不能告诉你,我经常看到高级语言的新手在没有意识到加入是正确的方法的情况下尝试做每件事。我曾经自己做过。哦,顺便说一下,在tcl中,它将是:
put[join$list],“
,我想javascript可能是:
console.log(array.join(“,”)
objective-c:[array componentsjoinedbythring:@],“]没有理由否决一个有效的解决方案。我想,如果(I!=mycontainer.begin())
?+1,那么迭代器就变成了
。绝对清楚。对于被否决的人:分支预测器。提到达夫的设备+2,-1表示没有实际使用开关:)@diebound开关必须在循环外,而不是像李杰的例子中那样在循环内。如果你认为它比goto好,可以随意使用:)有趣的阅读:
intersperse :: Show a => String -> [a] -> String
intersperse _ [] = ""
intersperse s (x:xs) = show x ++ concatMap ((s ++) . show) xs
*Main> intersperse "," [1,2,3]
"1,2,3"
*Main> intersperse "," [1]
"1"
*Main> intersperse ";" [1,2]
"1;2"
*Main> intersperse "," []
""