2011-11-13 64 views
10

Giả sử bạn có một enum với một số yếu tốLàm thế nào để ngẫu nhiên các phần tử enum?

public enum LightColor { 
    RED, YELLOW, GREEN 
} 

Và muốn chọn một cách ngẫu nhiên bất kỳ màu nào từ nó.

tôi đặt màu sắc vào một

public List<LightColor> lightColorChoices = new ArrayList<LightColor>(); 

lightColorChoices.add(LightColor.GREEN); 
lightColorChoices.add(LightColor.YELLOW); 
lightColorChoices.add(LightColor.RED); 

Và sau đó chọn một màu sắc ngẫu nhiên như:

this.lightColor = lightColorChoices.get((int) (Math.random() * 3)); 

Tất cả điều này (trong khi làm việc tốt) có vẻ không cần thiết phức tạp. Có cách nào đơn giản hơn để chọn một phần tử enum ngẫu nhiên không?

+0

là nhà phát triển đồng nghiệp của bạn cho một số ngẫu nhiên? ... xin lỗi, không. – ic3

+0

câu hỏi liên quan: http://stackoverflow.com/questions/5269250/random-value-from-enum-with-probability –

+0

Tôi nghĩ rằng điều này là giống như vấn đề ở bàn tay (gợi ý: tìm câu trả lời của trashgod): http : //stackoverflow.com/questions/1972392/java-pick-a-random-value-from-an-enum – DPM

Trả lời

22

enums Java thực sự hoàn toàn có khả năng đối tượng. Bạn có thể thêm một phương pháp để các enum khai

public enum LightColor { 
    Green, 
    Yellow, 
    Red; 

    public static LightColor getRandom() { 
     return values()[(int) (Math.random() * values().length)]; 
    } 
} 

nào sẽ cho phép bạn sử dụng nó như thế này:

LightColor randomLightColor = LightColor.getRandom(); 
+0

Điều này rất thú vị – JAM

+0

Cảm ơn bạn! , Nó hoạt động như một say mê!!! – Taber

0

Bạn có thể liên kết id nguyên với mỗi màu enum và có phương thức valueOf (int id) trả về màu tương ứng. Điều này sẽ giúp bạn thoát khỏi danh sách ..

Tiberiu

7
LightColor random = LightColor.values()[(int)(Math.random()*(LightColor.values().length))]; 
5

Sử dụng Enum.values() để có được tất cả các tùy chọn có sẵn và sử dụng các phương pháp Random.nextInt() xác định giá trị tối đa. ví dụ:

private static Random numberGenerator = new Random(); 
public <T> T randomElement(T[] elements) 
    return elements[numberGenerator.nextInt(elements.length)]; 
} 

này sau đó có thể được gọi như vậy:

LightColor randomColor = randomElement(LightColor.values()); 
+0

+1 để đề xuất Random.nextInt() thay vì nhân với kích thước – Jorn

3

này cần được chỉ đơn giản như hình dưới đây

LightColor[] values = LightColor.values(); 
LightColor value = values[(int) (Math.random() * 3)]; 
0

Vì vậy, đọc câu trả lời Kowser, tôi đã đưa ra một cái gì đó ở đây. Với một màu ChatColor có chứa các màu khác nhau, bạn có thể thực hiện như sau:

private ChatColor getRandomColor() { 
    ChatColor randomColor = ChatColor.values()[random.nextInt(ChatColor 
      .values().length - 1)]; 
    ChatColor[] blacklist = { ChatColor.BOLD, ChatColor.ITALIC, 
      ChatColor.MAGIC, ChatColor.RESET, ChatColor.STRIKETHROUGH, 
      ChatColor.UNDERLINE }; 
    while (Arrays.asList(blacklist).contains(randomColor)) { 
     randomColor = ChatColor.values()[random 
       .nextInt(ChatColor.values().length)]; 
    } 
    return randomColor; 
} 

và thậm chí có danh sách đen.

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