2017-02-10 16 views
5

配列やリストのすべての要素がtrueかどうかを調べる2つの関数があります。私は2つの組み合わせに問題があります。どのようにして関数を1つの一般的なJava関数にすることができますか。リスト<Boolean>とboolean []の汎用関数を作成する

public static boolean allTrue(boolean[] booleans) { 
    if (booleans == null) { 
     return false; 
    } 

    for (boolean bool : booleans) { 
     if (!bool) { 
      return false; 
     } 
    } 
    return true; 
} 

public static boolean allTrue(List<Boolean> booleans) { 
    if (booleans == null) { 
     return false; 
    } 

    for (boolean bool : booleans) { 
     if (!bool) { 
      return false; 
     } 
    } 
    return true; 
} 
+0

万が一あなたはグアバを使用していますか? – shmosel

+0

http://stackoverflow.com/a/5606435/2310289 –

+0

@shmosel No Guava – Kwoppy

答えて

4

あなたはグアバを使用している場合、あなたはBooleans.asList()のbooleanの配列をラップし、それをリストとして渡すことができます。

public static boolean allTrue(boolean[] booleans) { 
    return booleans != null && allTrue(Booleans.asList(booleans)); 
} 
+0

フードの下では、これはおそらく私が与えた答えより効率的ではありません。 –

+0

OPが効率性を懸念しているとは思わない。 – shmosel

+0

どちらの回答も質問に投稿されたコードよりも効率が悪いです。 – Winter

1

私は@Joelによって与えられた答えは除いて、良いものだったと思いますコメントで指摘された問題のために。あなただけの

public static boolean allTrue(Object booleans) { 

オブジェクトを受け入れ、その後、その後instanceof boolean[]またはinstanceof List<Boolean>とを確認することができ

public static boolean allTrue(List<Boolean> booleans) { 
    if (booleans == null) { 
     return false; 
    } 

    for (boolean bool : booleans) { 
     if (!bool) { 
      return false; 
     } 
    } 
    return true; 
} 

public static boolean allTrue(boolean[] booleans) { 
    Boolean[] newArray = new Boolean[booleans.length]; 
    int i = 0; 
    for (boolean value : booleans) { 
     newArray[i++] = Boolean.valueOf(value); 
    } 

    return Arrays.asList(newArray); 
} 
+1

これはどのように改善されませんか? 'allTrue'のロジックは、必要に応じて一箇所で変更するだけです。 –

2

として

https://stackoverflow.com/a/5606435/2310289ごとに:私たちはちょうどBoolean[]boolean[]を変換する場合、我々は次のよう試すことができますメソッド内で異なるコードを実行する

ここでも、本当に改善していますが、allTrue(Object booleans)大丈夫でない限り、あなたは一つの方法でそれを行うことはできませんのでList<Boolean>boolean[]のための共通の祖先は、Objectで統一

1

をコーディングするビット近いです。

メソッドシグネチャをallTrue(Iterable<Boolean> booleans)に変更する場合は、ブール値配列をトラバースする特別なIterator<Boolean>を作成するだけです。

import java.util.Iterator; 
import java.util.NoSuchElementException; 

public class BooleanAllTrue { 
    public static boolean allTrue(Iterable<Boolean> booleans) { 
     if (booleans == null) return false; 

     for (Boolean bool : booleans) { 
      if (!bool) return false; 
     } 

     return true; 
    } 

    public static Iterable<Boolean> asIterable(final boolean[] booleens) { 
     return new Iterable<Boolean>() { 
      public Iterator<Boolean> iterator() { 
       final boolean[] booleans = booleens; 
       return new Iterator<Boolean>() { 
        private int i = 0; 

        public boolean hasNext() { 
         return i < booleans.length; 
        } 

        public Boolean next() { 
         if (!hasNext()) throw new NoSuchElementException(); 
         return booleans[i++]; 
        } 

        public void remove() {throw new UnsupportedOperationException("remove");} 
       }; 
      } 
     }; 
    } 

    public static void main(String [] args) { 
     System.out.println(allTrue(asIterable(new boolean[]{true, true}))); 
     System.out.println(allTrue(asIterable(new boolean[]{true, false}))); 
     try { 
      asIterable(new boolean[0]).iterator().next(); 
     } catch (NoSuchElementException e) { 
      // expected 
     } 
    } 
} 

最後に、allTrue(boolean[] booleans)の方法。

public static boolean allTrue(boolean[] booleans) { 
    return allTrue(asIterable(booleans)); 
} 
+1

* 'List 'と 'boolean []'の共通の祖先は 'Object' *です。あなたがインターフェイスを数えているなら、両方とも 'Serializable'を実装します。それはあなたのポイントに関係するものではありません。 – shmosel

関連する問題