[英]Last iteration of enhanced for loop in java
有没有办法确定循环是否是最后一次迭代。 我的代码看起来像这样:
int[] array = {1, 2, 3...};
StringBuilder builder = new StringBuilder();
for(int i : array)
{
builder.append("" + i);
if(!lastiteration)
builder.append(",");
}
现在的问题是我不想在最后一次迭代中附加逗号。 现在有没有办法确定它是最后一次迭代还是我坚持使用 for 循环或使用外部计数器来跟踪。
另一种方法是在追加i之前附加逗号,而不是在第一次迭代时。 (请不要使用"" + i
,顺便说一下 - 你真的不想在这里连接,而且StringBuilder有一个非常好的追加(int)重载。)
int[] array = {1, 2, 3...};
StringBuilder builder = new StringBuilder();
for (int i : array) {
if (builder.length() != 0) {
builder.append(",");
}
builder.append(i);
}
关于这个的Iterable
是它可以与任何Iterable
- 你不能总是索引事物。 (当你真正使用StringBuilder时,“添加逗号然后将其删除”是一个很好的建议 - 但它不适用于写入流等内容。虽然这可能是解决这个问题的最佳方法。 )
另一种方法:
String delim = "";
for (int i : ints) {
sb.append(delim).append(i);
delim = ",";
}
更新:对于Java 8,您现在拥有收集器
总是追加可能更容易。 然后,当你完成循环时,只需删除最后一个字符。 通过这种方式减少条件。
您可以使用StringBuilder
的deleteCharAt(int index)
,索引为length() - 1
也许你正在使用错误的工具来完成工作。
这比你正在做的更加手动,但如果不是有点“老派”,它会更优雅
StringBuffer buffer = new StringBuffer();
Iterator iter = s.iterator();
while (iter.hasNext()) {
buffer.append(iter.next());
if (iter.hasNext()) {
buffer.append(delimiter);
}
}
这几乎是StackOverflow问题的重复。 你想要的是StringUtils ,并调用join方法。
StringUtils.join(strArr, ',');
另一种解决方案(也许效率最高)
int[] array = {1, 2, 3};
StringBuilder builder = new StringBuilder();
if (array.length != 0) {
builder.append(array[0]);
for (int i = 1; i < array.length; i++ )
{
builder.append(",");
builder.append(array[i]);
}
}
显式循环总是比隐式循环更好。
builder.append( "" + array[0] );
for( int i = 1; i != array.length; i += 1 ) {
builder.append( ", " + array[i] );
}
你应该将整个事情包装在if语句中,以防你处理零长度数组。
保持简单并使用标准for循环:
for(int i = 0 ; i < array.length ; i ++ ){
builder.append(array[i]);
if( i != array.length - 1 ){
builder.append(',');
}
}
或者只使用apache commons-lang StringUtils.join()
如果将其转换为经典索引循环,是的。
或者你可以在完成后删除最后一个逗号。 像这样:
int[] array = {1, 2, 3...};
StringBuilder
builder = new StringBuilder();
for(int i : array)
{
builder.append(i + ",");
}
if(builder.charAt((builder.length() - 1) == ','))
builder.deleteCharAt(builder.length() - 1);
我,我只是使用commons-lang的 StringUtils.join()
。
你需要Class Separator 。
Separator s = new Separator(", ");
for(int i : array)
{
builder.append(s).append(i);
}
类Separator
的实现很简单。 它包装了每次调用toString()
返回的字符串,除了第一次调用,它返回一个空字符串。
基于java.util.AbstractCollection.toString(),它会提前退出以避免分隔符。
StringBuffer buffer = new StringBuffer();
Iterator iter = s.iterator();
for (;;) {
buffer.append(iter.next());
if (! iter.hasNext())
break;
buffer.append(delimiter);
}
它既高效又优雅,但不像其他一些答案那样不言自明。
这是一个解决方案:
int[] array = {1, 2, 3...};
StringBuilder builder = new StringBuilder();
bool firstiteration=true;
for(int i : array)
{
if(!firstiteration)
builder.append(",");
builder.append("" + i);
firstiteration=false;
}
寻找第一次迭代:)
这是我运行的SSCCE基准测试(与我必须实现的相关)以及这些结果:
elapsed time with checks at every iteration: 12055(ms)
elapsed time with deletion at the end: 11977(ms)
至少在我的例子,在每次迭代跳过检查并无明显改善尤其是对数据的健全卷,但它是速度更快。
import java.util.ArrayList;
import java.util.List;
public class TestCommas {
public static String GetUrlsIn(int aProjectID, List<String> aUrls, boolean aPreferChecks)
{
if (aPreferChecks) {
StringBuffer sql = new StringBuffer("select * from mytable_" + aProjectID + " WHERE hash IN ");
StringBuffer inHashes = new StringBuffer("(");
StringBuffer inURLs = new StringBuffer("(");
if (aUrls.size() > 0)
{
for (String url : aUrls)
{
if (inHashes.length() > 0) {
inHashes.append(",");
inURLs.append(",");
}
inHashes.append(url.hashCode());
inURLs.append("\"").append(url.replace("\"", "\\\"")).append("\"");//.append(",");
}
}
inHashes.append(")");
inURLs.append(")");
return sql.append(inHashes).append(" AND url IN ").append(inURLs).toString();
}
else {
StringBuffer sql = new StringBuffer("select * from mytable" + aProjectID + " WHERE hash IN ");
StringBuffer inHashes = new StringBuffer("(");
StringBuffer inURLs = new StringBuffer("(");
if (aUrls.size() > 0)
{
for (String url : aUrls)
{
inHashes.append(url.hashCode()).append(",");
inURLs.append("\"").append(url.replace("\"", "\\\"")).append("\"").append(",");
}
}
inHashes.deleteCharAt(inHashes.length()-1);
inURLs.deleteCharAt(inURLs.length()-1);
inHashes.append(")");
inURLs.append(")");
return sql.append(inHashes).append(" AND url IN ").append(inURLs).toString();
}
}
public static void main(String[] args) {
List<String> urls = new ArrayList<String>();
for (int i = 0; i < 10000; i++) {
urls.add("http://www.google.com/" + System.currentTimeMillis());
urls.add("http://www.yahoo.com/" + System.currentTimeMillis());
urls.add("http://www.bing.com/" + System.currentTimeMillis());
}
long startTime = System.currentTimeMillis();
for (int i = 0; i < 300; i++) {
GetUrlsIn(5, urls, true);
}
long endTime = System.currentTimeMillis();
System.out.println("elapsed time with checks at every iteration: " + (endTime-startTime) + "(ms)");
startTime = System.currentTimeMillis();
for (int i = 0; i < 300; i++) {
GetUrlsIn(5, urls, false);
}
endTime = System.currentTimeMillis();
System.out.println("elapsed time with deletion at the end: " + (endTime-startTime) + "(ms)");
}
}
正如工具包所提到的,在Java 8中我们现在有了收集器 。 这是代码的样子:
String joined = array.stream().map(Object::toString).collect(Collectors.joining(", "));
我认为这正是你正在寻找的东西,而且这是你可以用于许多其他事情的模式。
还有另一种选择。
StringBuilder builder = new StringBuilder();
for(int i : array)
builder.append(',').append(i);
String text = builder.toString();
if (text.startsWith(",")) text=text.substring(1);
这里描述的许多解决方案都有点过头了,恕我直言,特别是那些依赖外部库的解决方案。 有一个很好的干净,清晰的习惯用法来实现我一直使用的逗号分隔列表。 它依赖于条件(?)运算符:
编辑 :原始解决方案正确,但根据评论非最佳。 第二次尝试:
int[] array = {1, 2, 3};
StringBuilder builder = new StringBuilder();
for (int i = 0 ; i < array.length; i++)
builder.append(i == 0 ? "" : ",").append(array[i]);
你可以在4行代码中找到,包括数组的声明和StringBuilder。
另一种方法是将数组的长度(如果可用)存储在单独的变量中(比每次重新检查长度更有效)。 然后,您可以将索引与该长度进行比较,以确定是否添加最终逗号。
编辑:另一个考虑因素是权衡去除最终字符(可能导致字符串副本)的性能成本,而不是在每次迭代中检查条件。
这里有两条备用路径:
1: Apache Commons String Utils
2:保持一个名为first
的布尔值,设置为true。 在每次迭代中,如果first
为false,则附加逗号; 之后, first
设置为false。
如果您只是将数组转换为逗号分隔数组,则许多语言都具有连接函数。 它将数组转换为一个字符串,每个元素之间都有一个分隔符。
由于它是一个固定的数组,因此简单地避免增强...更容易。如果Object是一个集合,迭代器会更容易。
int nums[] = getNumbersArray();
StringBuilder builder = new StringBuilder();
// non enhanced version
for(int i = 0; i < nums.length; i++){
builder.append(nums[i]);
if(i < nums.length - 1){
builder.append(",");
}
}
//using iterator
Iterator<int> numIter = Arrays.asList(nums).iterator();
while(numIter.hasNext()){
int num = numIter.next();
builder.append(num);
if(numIter.hasNext()){
builder.append(",");
}
}
在这种情况下,实际上不需要知道它是否是最后一次重复。 我们有很多方法可以解决这个问题。 一种方法是:
String del = null;
for(int i : array)
{
if (del != null)
builder.append(del);
else
del = ",";
builder.append(i);
}
您可以使用StringJoiner 。
int[] array = { 1, 2, 3 };
StringJoiner stringJoiner = new StringJoiner(",");
for (int i : array) {
stringJoiner.add(String.valueOf(i));
}
System.out.println(stringJoiner);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.