创建枚举列表?

时间:2016-01-14 22:03:46

标签: java enums

所以我有三个枚举,我想用它们制作一个ArrayList。这是我的代码:

enum Outlook {
    SUNNY, RAINY, CLOUDY
}
enum Temperature {
    HOT, COLD, MILD
}
enum Humidity {
    HIGH, NORMAL, LOW
}

我希望我的ArrayList看起来像:

{Outlook, Temperature, Humidity}

这是我尝试过的:

ArrayList<Enum> attributes = new ArrayList<Enum>();
attributes.add(Temperature);

但是Eclipse已经告诉我“温度无法解析为变量”。知道如何实现我的目标吗?

4 个答案:

答案 0 :(得分:1)

我猜想你想要枚举本身的名字,而不是他们的价值观。因此,请尝试以下代码:

public static void main (String[] args) throws java.lang.Exception
{
    List<Class<? extends Enum>> myEnums = new ArrayList<>();
    myEnums.add(Outlook.class);
    myEnums.add(Temperature.class);
    myEnums.add(Humidity.class);
    System.out.println(myEnums);
}

enum Outlook {
    SUNNY, RAINY, CLOUDY
}
enum Temperature {
    HOT, COLD, MILD
}
enum Humidity {
    HIGH, NORMAL, LOW
}

您可以看到将输出的演示here

[class Ideone$Outlook, class Ideone$Temperature, class Ideone$Humidity]

如果您严格需要以下内容:

[Outlook, Temperature, Humidity]

并且无法获得额外的class Ideone$...信息,我们可以添加一些额外的复杂程度。

答案 1 :(得分:1)

  

我想循环遍历所有类(Outlook,Temp,Humidity),并为每个类计算信息增益。这是一个利用给定属性(Outlook,Temp,Humidity)的每个可能值的函数。

一种可能性是定义由所有属性实现的公共接口。这将允许您的信息增益功能使用相同的接口,无论属性如何。并且不需要反思。例如:

interface IAttribute {
    Enum<?>[] getValues();
    String getName();
}

此接口作为一个整体应用于属性类,而不是特定的属性值。这是实现这一目标的一种方法。

private static final class OutlookAttribute implements IAttribute {
    enum Outlook { SUNNY, RAINY, CLOUDY }

    @Override
    public Outlook[] getValues() { return Outlook.values(); }

    @Override
    public String getName() { return "Outlook"; }
}

// And similarly for Temperature and Humidity

现在,您可以创建要传递给函数的属性列表。

List<IAttribute> attributes = new ArrayList<>();
attributes.add( new OutlookAttribute() );
attributes.add( new TemperatureAttribute() );
attributes.add( new HumidityAttribute() );

您的函数定义可以遍历属性。

for ( IAttribute attribute : attributes ) {
   Object[] values = attribute.getValues();
   ...
   for ( Object value : values ) {
      ...
   }
   ...
}

答案 2 :(得分:0)

您需要指定要添加的值:

attributes.add(Temperature.HOT);
attributes.add(Temperature.COLD);

Temperature单独评估为class,但您的ArrayList只能包含Enum s Temperature.HOTHumidity.HIGH ... )

答案 3 :(得分:0)

如果您需要enum typ中的所有值。使用Enumtyp.values()。

public interface EnumInterface {
        public static enum Outlook {
            SUNNY, RAINY, CLOUDY
        }
        public static enum Temperature {
            HOT, COLD, MILD
        }
        public static enum Humidity {
            HIGH, NORMAL, LOW
        }
    }



    public class EnumImp {
        private static ArrayList<Enum> list = new ArrayList<>();

        public void addUnits() {
            EnumInterface.Outlook[] outlookValues = EnumInterface.Outlook.values();
            EnumInterface.Temperature[] temperatureValues = EnumInterface.Temperature.values();
            EnumInterface.Humidity[] humidityValues = EnumInterface.Humidity.values();

            for (int i = 0; i < outlookValues.length; i++) {
                list.add(outlookValues[i]);
            }
            for (int i = 0; i < temperatureValues.length; i++) {
                list.add(temperatureValues[i]);
            }
            for (int i = 0; i < humidityValues.length; i++) {
                list.add(humidityValues[i]);
            }

        }

        public void output() {
            for (int i = 0; i < list.size(); i++) {
                System.out.println(list.get(i));
            }
        }
    }

    public class TestEnum {

        public static void main(String[] args) {
            EnumImp e = new EnumImp();
            e.addUnits();
            e.output();
        }
    }