关于困扰我的一个真正的小问题,我有一个简单的一般性问题: 我正在打印一个元素列表,所以我没有关于打印元素数量的事先知识。我想要一个简单的格式,其中元素由逗号(elem1,elem2 ...)或类似的东西分隔。现在,如果我使用一个简单的循环:
while(elements to check) {
if (elem should be printed) {
print elem . ","
}
}
我在最后一个元素后面得到一个逗号... 我知道这听起来很愚蠢,但有办法解决这个问题吗?
答案 0 :(得分:4)
让我们假设“应该打印”意味着“至少有一个非空白字符。在Perl中,写这个的惯用方法是(你需要调整grep才能尝试):
print join "," => grep { /\S/ } @elements;
“grep”在其他语言中类似于“filter”,而/ S /是匹配一个非空白字符的正则表达式。仅返回与表达式匹配的元素。 “加入”应该是不言自明的。
perldoc -f join
perldoc -f grep
答案 1 :(得分:3)
将所有数据放入数组然后
的方式print join(',', @yourarray)
是一个很好的。
您也可以在循环连接之后
declare eltToPrint while (LOOP on elt) { eltToPrint .= elt.',' }
使用正则表达式删除最后一个逗号:
eltToPrint =~s/,$//;
ps:如果你把逗号放在开头
也可以eltToPrint =~s/^,//;
答案 2 :(得分:2)
Java没有内置join
,但如果您不想重新发明轮子,可以使用Guava's Joiner
。它可以skipNulls
或useForNull(something)
。
使用分隔符连接文本(指定为数组,
Iterable
,varargs甚至Map
)的对象。它会将结果附加到Appendable
或将其作为String
返回。例如:Joiner joiner = Joiner.on("; ").skipNulls(); return joiner.join("Harry", null, "Ron", "Hermione");
返回字符串
"Harry; Ron; Hermione"
。请注意,所有输入元素在被追加之前都会使用Object.toString()
转换为字符串。
答案 3 :(得分:0)
根据语言的不同,您有多种选择。
e.g。在JavaScript中只做:
var prettyString = someArray.join(', ');
在PHP中你可以implode()
$someArray = array('apple', 'orange', 'pear');
$prettyString = implode(",", $someArray);
如果所有其他方法都失败了,您可以在每个条目后添加逗号并在完成后修剪最后一个,或者在/ foreach循环时检查您(对于perf不好)如果这不是最后一项(如果是,则添加一个逗号)
更新: ,因为您注意到了Java ...您可以创建一个这样的方法:
public static String join(String[] strings, String separator) {
StringBuffer sb = new StringBuffer();
for (int i=0; i < strings.length; i++) {
if (i != 0) sb.append(separator);
sb.append(strings[i]);
}
return sb.toString();
}
更新2: 听起来你真的想要这个,如果你没有输出每个元素(伪代码):
first = true;
for(item in list){
if(item meets condition){
if(!first){
print ", ";
} else {
first = false;
}
print item;
}
}
答案 4 :(得分:0)
我想最简单的方法是创建一个新数组,其中只包含您需要打印的原始数组中的元素(即filter
操作)。然后打印新创建的数组,最好使用语言的内置数组/向量打印/连接函数。
(在Perl中)
@orig=("a","bc","d","ef","g");
@new_list=();
for $x(@orig){
push(@new_list,$x) if (length($x)==1);
}
print join(',',@new_list)."\n";
(在Java中)
List<String> orig=Arrays.asList(new String[]{"a","bc","d","ef","g"});
List<String> new_list=new ArrayList<String>();
for(String x: orig){
if (x.length()==1)
new_list.add(x);
}
System.out.println(new_list);
答案 5 :(得分:0)
为什么不在每个元素(但第一个元素)之前添加逗号?伪代码:
is_first = true
loop element over element_array
BEGIN LOOP
if (! is_first)
print ","
end if
print element
is_first = false
END
print NEWLINE