2017-02-10 6 views
5

के लिए फ़ंक्शन जेनेरिक बनाएं मेरे पास दो फ़ंक्शन हैं जो जांचते हैं कि किसी सरणी या सूची के सभी तत्व true हैं या नहीं। मुझे दोनों के संयोजन में परेशानी हो रही है। मैं कार्यों को एक सामान्य जावा फ़ंक्शन में कैसे बना सकता हूं।सूची <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 नो गुवा – Kwoppy

उत्तर

4

आप अमरूद का उपयोग कर रहे हैं, तो आप Booleans.asList() में बूलियन सरणी लपेट और एक सूची के रूप में यह पारित कर सकते हैं:

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

हुड के तहत, यह शायद मेरे द्वारा दिए गए उत्तर से अधिक कुशल नहीं है। –

+0

मुझे कोई संकेत नहीं दिख रहा है ओपी दक्षता के बारे में चिंतित था। – 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[] कनवर्ट करते हैं, हम यह कर सकते विधि के भीतर अलग कोड प्रदर्शन करते हैं।

फिर

, नहीं वास्तव में एक सुधार है, लेकिन थोड़ा और करीब List<Boolean> के लिए एकीकरण

1

आम पूर्वज कोड करने के लिए और boolean[], Object है, इसलिए जब तक आप allTrue(Object booleans) साथ ठीक हैं, तो आप एक विधि के साथ यह नहीं कर सकते।

यदि आप अपना विधि हस्ताक्षर 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

* 'सूची ' और 'बूलियन []' के लिए सामान्य पूर्वज 'ऑब्जेक्ट' * है। यदि आप इंटरफेस की गिनती कर रहे हैं, तो वे दोनों 'सीरियलज़ेबल' लागू करते हैं। यह नहीं कि यह आपके बिंदु से प्रासंगिक है। – shmosel

संबंधित मुद्दे