2017-02-10 11 views
5

Tôi có hai chức năng kiểm tra xem tất cả các phần tử của một mảng hoặc danh sách là true. Tôi gặp khó khăn khi kết hợp cả hai. Làm thế nào tôi có thể làm cho các hàm thành một hàm Java chung.Thực hiện chức năng chung cho Danh sách <Boolean> và 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

Bạn có đang sử dụng Guava không? – shmosel

+0

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

+0

@shmosel No Guava – Kwoppy

Trả lời

4

Nếu bạn đang sử dụng ổi, bạn có thể quấn mảng boolean trong Booleans.asList() và vượt qua nó như là một danh sách:

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

Dưới mui xe, điều này có lẽ không hiệu quả hơn câu trả lời tôi đưa ra. –

+0

Tôi không thấy bất kỳ dấu hiệu nào OP quan tâm đến hiệu quả. – shmosel

+0

Cả hai câu trả lời đều kém hiệu quả hơn mã được đăng trong câu hỏi. – Winter

1

Tôi nghĩ câu trả lời được đưa ra bởi @Joel là một tốt nhất, ngoại trừ cho vấn đề được nêu trong nhận xét. Nếu chúng ta chỉ chuyển đổi boolean[] để Boolean[], chúng ta có thể thử như sau:

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

Làm thế nào mà không phải là cải tiến? Logic của 'allTrue' bây giờ chỉ cần được thay đổi ở một vị trí nếu cần thiết. –

2

Theo https://stackoverflow.com/a/5606435/2310289

Bạn chỉ có thể chấp nhận một Object

public static boolean allTrue(Object booleans) { 

và sau đó kiểm tra cho instanceof boolean[] hoặc instanceof List<Boolean> và sau đó thực hiện các mã khác nhau trong phương thức.

Một lần nữa, không thực sự được cải thiện, nhưng một chút gần gũi hơn với mã thống nhất

1

Các tổ tiên chung cho List<Boolean>boolean[]Object, vì vậy trừ khi bạn là okay với allTrue(Object booleans), bạn không thể làm điều đó với một phương pháp.

Nếu bạn thay đổi chữ ký phương thức thành allTrue(Iterable<Boolean> booleans), tất cả những gì bạn phải làm là tạo Iterator<Boolean> đặc biệt để duyệt qua mảng 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 
     } 
    } 
} 

Và cuối cùng là phương pháp allTrue(boolean[] booleans).

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

* Tổ tiên chung cho 'Danh sách ' và 'boolean []' là 'Đối tượng' *. Nếu bạn đang đếm giao diện, cả hai đều thực hiện 'Serializable'. Không phải điều đó có liên quan đến quan điểm của bạn. – shmosel

Các vấn đề liên quan