[英]Second condition alternative for-loop
我有一個在do-while
循環結束時更新的集合。 在此do-while loop
,有一個for loop
。
例如:( 這不起作用,但說明了我正在嘗試實現的目標)
List<String> list =....load up with stuff
do {
for (String string : list && counter < 5)
{
System.out.println(string);
counter++;
}
while(update list)
正常表示方式:
do {
for (int i = 0; i < list.size() && counter < 5; i++)
{
System.out.println(list.get(i));
counter++;
}
while(update list)
在此構造中不起作用。
我用這段代碼嘗試了兩個答案:
int counter = 0;
List<String> list = new ArrayList<String>();
list.add("a");
list.add("b");
list.add("c");
list.add("d");
list.add("e");
System.out.println("Test one");
for (String string : list) {
if(counter < 3 )
System.out.println(string);
else
break;
counter++;
}
System.out.println("Test two");
counter = 0;
for (String string : list) {
if (counter >= 3) break;
System.out.println(string);
counter++;
}
TedHopp的答案解決了第一個循環的突破。
脫離for loop
和 while loop
,我最終做了以下工作:
int breakNow = false;
do {
for (String string : list)
{
System.out.println(string);
counter++;
if (counter >= 3)
{
breakNow = true;
break;
}
}
while(update list && !breakNow)
您不能將二進制測試與增強的for
循環合並; 語法不允許。 你需要使用傳統for
循環語法,要不然就把布爾測試循環中,並break
它了。
for (String string : list) {
if (counter >= 5) break;
System.out.println(string);
counter++;
}
我不確定傳統的語法對增強的for
循環是否有效; 他們基本上做同樣的事情。 (實際上,由於增強的for
循環使用迭代器,因此如果異步更新列表,則可能會遇到並發修改異常的風險。)
默認情況下不是,但是您可以創建類似以下內容的好東西:
public class ForEachCondition
{
public static void main(String[] args)
{
List<Integer> ints = new ArrayList<Integer>();
ints.add(1);
ints.add(3);
ints.add(100);
ints.add(200);
for (Integer i : new ConditionalIterator<Integer>(ints, new ConditionalIterator.Condition<Integer>()
{
@Override
public boolean next(Integer t)
{
return t < 130;
}
}))
{
System.out.println(i);
}
}
}
class ConditionalIterator<T> implements Iterable<T>, Iterator<T>
{
private Condition<T> condition;
private Iterator<T> iterator;
private T next;
public ConditionalIterator(Iterable<T> it, Condition<T> cond)
{
this.iterator = it.iterator();
this.condition = cond;
}
@Override
public Iterator<T> iterator()
{
return this;
}
@Override
public boolean hasNext()
{
if (iterator.hasNext())
{
next = iterator.next();
return condition.next(next);
}
return false;
}
@Override
public T next()
{
return next;
}
@Override
public void remove()
{
iterator.remove();
}
public static interface Condition<T>
{
public boolean next(T t);
}
}
使用新的Java 8,for可能如下所示:
for (Integer i : new ConditionalIterator<Integer>(ints, (Integer t) -> t < 130)
{
System.out.println(i);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.