0

私は友人とカード ゲームを作成していて、カード ビューアーを作成することにしました。すべてのカードの詳細をテキスト ドキュメントに入力すると、私のプログラムは各カードを 1 行ずつ読み取ります。

カードの種類によってプロパティが異なり、すべてのプロパティは何らかの種類の列挙型で表されます。

文字列のリストを列挙型プロパティのリストに変換するコードがあります。列挙型の例:

public enum Race{
ELVES, HUMANS, DWARFS
} 

public enum Rarity{
COMMON, UNCOMMON, RARE
}

カードが複数の種族と複数の希少性を持つことができると仮定すると、文字列のリストと列挙型の型を取り、列挙値のリストを返すメソッドを作成したいと思います。

// Take in an array of strings and a type of Enum value to convert them to
public <Type extends Enum<Type>> Type[] getValues(String[] strings){

// Make an array to hold the enum values
Type[] values = new Type[strings.length];

// For each string, convert it into an enum value and add it to the array
for (int i = 0; i < strings.lenght; i++)
    values[i] = Type.valueOf(strings[i]);

return values;
}

このメソッドが機能しないことはわかっていますが、少なくとも私がやろうとしていることを描写していることを願っています。文字列のリストを送信でき、EnumValues のリストに変換するメソッドが欲しいです文字列 {"ELVES", HUMANS"} を関連する Race 値 {ELVES, HUMANS} に変換します。

なぜ私が次のような個別のメソッドを作成しないのかと尋ねるかもしれません。

convertRaceStings(String[] strings){//method workings here}
convertRarityStings(String[] strings){//method workings here}

残念ながら、ここで使用されている 2 つの列挙型は単純な例であり、それぞれ別のメソッドを必要とする多数の列挙型があります。

4

4 に答える 4

4

列挙型の配列の代わりに EnumSet を使用する必要があります。メモリ効率が向上します。おまけとして、ジェネリック配列をいじる必要はありません。

メソッドは次のようになります。

private static <T extends Enum<T>> EnumSet<T> createEnumSet(Class<T> clazz, String... values) {
    EnumSet<T> set = EnumSet.noneOf(clazz);
    for(String value : values) {
        set.add(Enum.valueOf(clazz, value));
    }
    return set;
}

同じ列挙型の複数のインスタンスが必要な場合を除きます。

使用法:

final EnumSet<Race> races = createEnumSet(Race.class, "HUMANS", "DWARFS");
于 2013-06-18T14:12:24.327 に答える
3

配列の操作は、一般的なコードではやや面倒です。

@SuppressWarnings("unchecked")
public <E extends Enum<E>> E[] getValues(Class<E> clazz, String[] strings) {
  E[] result = (E[])java.lang.reflect.Array.newInstance(clazz, strings.length);
  for (int i = 0; i < strings.length; ++i) {
    result[i] = Enum.valueOf(clazz, strings[i]);
  }
  return result;
}

これはうまくいくはずです。

于 2013-06-18T14:03:17.440 に答える
2

列挙型も渡した方が簡単です。これにより、Enum#valueOf静的メソッドを使用できるようになります。

public static void main(String[] args) {
    System.out.println(get("ELVES", Race.class));
    System.out.println(get("COMMON", Rarity.class));
}

public static <T extends Enum<T>> T get(String value, Class<T> clazz) {
    return Enum.valueOf(clazz, value);
}

public static enum Race {

    ELVES, HUMANS, DWARFS
}

public static enum Rarity {

    COMMON, UNCOMMON, RARE
}

列挙型クラスを 2 番目の引数として渡したくない場合は、どこかにマッピングを維持する必要があります。

于 2013-06-18T13:59:33.350 に答える
-1

Java の列挙型は非常に強力です。列挙は定数であり、動的に追加できないため、次のようにすることができます。

public enum Race {
    ELVES, HUMANS, DWARFS;

    public static Race getValue(String name) {
        switch (name.toLowerCase()) {
            case "evles": return EVLES;
            case "humans": return HUMANS;
            case "dwarfs": return DWARFS;
            default: throw new Exception();
        }
    }
}

これは、Java 7 を使用していることを前提としていますが、そうでない場合は、スイッチを else-if ステートメントに置き換えてください。

于 2013-06-18T13:59:42.680 に答える