2016-07-14 22 views
5

Tôi có một số EnumSet và muốn chuyển đổi qua lại thành/từ một mảng nguyên thủy boolean. Nếu nó hoạt động tốt hơn, tôi có thể làm việc với một List thay vì một mảng, và/hoặc Boolean đối tượng thay vì nguyên thủy boolean.Chuyển đổi giữa EnumSet và mảng giá trị boolean

enum MyEnum { DOG, CAT, BIRD; } 
EnumSet enumSet = EnumSet.of(MyEnum.DOG, MyEnum.CAT); 

Những gì tôi muốn nhận được ở đầu bên kia là một mảng trông như thế này:

[TRUE, TRUE, FALSE] 

Câu hỏi này ở đây cũng tương tự như thế này, Convert an EnumSet to an array of integers. Sự khác biệt:

  • boolean hoặc Boolean so với số nguyên (rõ ràng)
  • Tôi muốn tất cả các thành viên của enum để được đại diện, với một TRUE cho mỗi phần tử enum bao gồm trong EnumSetFALSE cho mỗi yếu tố đó sẽ bị loại trừ từ số EnumSet. Mảng của Câu hỏi khác chỉ bao gồm các mục được tìm thấy trong số EnumSet. (Quan trọng hơn)

Trả lời

6

Để làm được điều mà bạn muốn về cơ bản viết

MyEnum[] values = MyEnum.values(); // or MyEnum.class.getEnumConstants() 
boolean[] present = new boolean[values.length]; 
for (int i = 0; i < values.length; i++) { 
    present[i] = enumSet.contains(values[i]); 
} 

Đi theo một hướng khác, từ boolean mảng present tạo ở trên để enumSet_ tạo dưới đây.

EnumSet<MyEnum> enumSet_ = EnumSet.noneOf (MyEnum.class); // Instantiate an empty EnumSet. 
MyEnum[] values_ = MyEnum.values(); 
for (int i = 0 ; i < values_.length ; i ++) { 
    if (present[ i ]) { // If the array element is TRUE, add the matching MyEnum item to the EnumSet. If FALSE, do nothing, effectively omitting the matching MyEnum item from the EnumSet. 
     enumSet_.add (values_[ i ]); 
    } 
} 
+0

Cảm ơn. Tôi đã tò mò về cú pháp lambda/stream fancier nhưng nó là tốt để hiển thị cú pháp đơn giản nhưng chắc chắn cũ. –

+0

Tôi lấy tự do viết mã ví dụ để đi theo hướng khác, từ mảng đến EnumSet. Mã này dựa trên một số mã hoạt động của tôi, nhưng được sửa đổi để phù hợp với ví dụ của bạn ở đây. Vì vậy, tôi không phải là 100% nếu mã của tôi được đăng ở đây là chính xác. –

+0

@BasilBourque, 'QuarterHour' là gì? – Andrew

2

Trong Java 8 bạn có thể làm điều đó như thế này

List<Boolean> present = Arrays.stream(MyEnum.values()).map(enumSet::contains).collect(Collectors.toList()); 

Để đi theo con đường khác xung quanh bạn có thể làm một cái gì đó như thế này

IntStream.range(0, present.size()).filter(present::get).mapToObj(i -> MyEnum.values()[i]). 
    collect(Collectors.toCollection(() -> EnumSet.noneOf(MyEnum.class))); 
4

Đối với hiện tại, tôi không xem giải pháp tốt hơn so với

Boolean[] b = Arrays.stream(MyEnum.values()).map(set::contains).toArray(Boolean[]::new); 

To nhận được một EnumSet từ một mảng của boolean nguyên thủy bằng cách sử dụng zip

MyEnum[] enums = zip(Arrays.stream(MyEnum.values()), Arrays.stream(b), 
    (e, b) -> b ? e : null).filter(Objects::nonNull).toArray(MyEnum[]::new); 
+1

Phương thức chứa sẽ không lặp lại toàn bộ enum. Phương thức contains được ghi đè trong cả hai triển khai EnumSet, JumboEnumSet và RegularEnumSet. –

+1

@DLevant, cảm ơn bạn, tôi đã sửa – Andrew

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