簡體   English   中英

第二條件替代循環

[英]Second condition alternative for-loop

是否有可能在Java的循環表示替代方法中添加第二個條件。

我有一個在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM