2015-06-27 2 views
1

пытается найти элемент по его постоянному параметру/значению поля (то есть value0/value1/value2) без iterarting; есть ли способ? найден метод утилиты guava, который работает для имени константы enum (т. Е. CONSTANT0/CONSTANT1/CONSTANT2), а не значения параметра/поля для этого имени.Найти, если он присутствует в перечислении без итерации?

import com.google.common.base.Enums; 

    enum Enum { 
     CONSTANT0("value0"), CONSTANT1("value1"), CONSTANT2("value2"); 
     private final String value; 

     Enum(String value) { 
      this.value = value; 
     } 

     public String getValue() { 
      return value; 
     } 
    } 

    public class Driver { 
     public static void main(String[] args) { 
      // prints when input is value0 
      for (Enum constant : Enum.values()) { 
       if (constant.getValue().equalsIgnoreCase(args[0])) { 
        System.out 
          .println("vanilla version works with value i.e. java Driver value0" 
            + args[0]); 
       } 
      } 
      // prints when input is CONSTANT0 
      if (Enums.getIfPresent(Enum.class, args[0]).isPresent()) 
       System.out 
         .println("guava version works with constant i.e. java Driver CONSTANT0" 
           + args[0]); 
     } 
    } 
+1

Попробуйте иметь свой 'Enum' конструктор надстройку себя к «карте». – ajb

ответ

1

No.

Перечисления были разработаны и внедрены в Java 1.5 для того, чтобы позволить разработчикам перечислить свои константы чистого пути. Если вы посмотрите на источник Enum.java, вы не увидите простого метода поиска, аналогичного методу хэш-карты. Для ясности кода, если вы хотите проверить, содержит ли ваше перечисление значение, не требуя повторения в каждом случае, вы должны создать статический метод, который выполняет итерацию над содержимым вашего перечисления.

Пожалуйста, дайте мне знать, если у вас есть вопросы!

+4

Или OP может построить карту в пределах своего перечисления - нет необходимости, чтобы каждый поиск был O (n). Хотя, если перечисление не имеет большого количества значений, это не очень проблема ... –

+1

@JonSkeet, 1) Я ОГРОМНЫЙ поклонник ваших вкладов в SO. +1, Ты прав. Не слишком знакомы с деталями этой реализации, но предоставят OP со следующими ссылками (http://www.canoo.com/blog/2010/09/24/beautiful-java-enums/) (http: // javarevisited. blogspot.com/2012/09/what-is-enummap-in-java-example-tutorial.html) благодарим вас за ваше время! –

+1

Стоит упомянуть - я считаю, что хотя бы какой-то код в JDK внутренне генерирует кэшированную карту - я создаю источник 'valueOf' или' Enum.valueOf (MyEnum.class, name) ' –

0

на основе предложений по @Jon Skeet@Patricia Shanahan@Devarsh Desai@ajb

import java.util.EnumMap; 
import java.util.Map; 

import com.google.common.base.Enums; 

enum Enum { 
    CONSTANT0("value0"), CONSTANT1("value1"), CONSTANT2("value2"); 
    private final String value; 
    static final Map<Enum, String> enumMap = new EnumMap<Enum, String>(
      Enum.class); 

    static { 
     for (Enum e : Enum.values()) 
      enumMap.put(e, e.getValue()); 
    } 

    private Enum(String value) { 
     this.value = value; 
    } 

    public String getValue() { 
     return value; 
    } 
} 

public class Driver { 
    public static void main(String[] args) { 
     // prints when input is value0 
     for (Enum constant : Enum.values()) { 
      if (constant.getValue().equalsIgnoreCase(args[0])) { 
       System.out 
         .println("vanilla version works with value i.e. java Driver value0 " 
           + args[0]); 
      } 
     } 
     // prints when input is CONSTANT0 
     if (Enums.getIfPresent(Enum.class, args[0]).isPresent()) 
      System.out 
        .println("guava version works with constant i.e. java Driver CONSTANT0 " 
          + args[0]); 
     // prints when input is value0 
     if (Enum.enumMap.containsValue(args[0])) 
      System.out 
        .println("static map version works with value i.e. java Driver value0 " 
          + args[0]); 
    } 
} 
1

В отсутствие элегантной собственной или библиотечной функции, я предлагаю вам идти Java 8:

Stream.of(Enum.values()).anyMatch(e -> e.getValue().equals("value0")); 
Смежные вопросы