0

カスタム オブジェクトでいっぱいの ArrayList があります。この ArrayList を Bundle に保存し、後で取得する必要があります。

Serializable と Parcelable の両方で失敗したので、ArrayList のインデックスに関連付けられているオブジェクトを何らかの方法で保存しようとしているだけで、Bundle を復元してオブジェクトを追加し直すときにこれらをチェックしています。

私が持っているのは次のようなものです:

バンドルを保存する場合:

    //Create temporary array of the same length as my ArrayList
    String [] tempStringArray = new String[myList.size()];

    //Convert the enum to a string and save it in the temporary array
    for (int i = 0; i<myList.size();i++){
                tempStringArray [i] = myList.get(i).getType();  //returns the enum in string form
    }

    //Write this to the Bundle
    bundle.putStringArray("List", tempStringArray);

これで、もともと ArrayList にあったオブジェクトの列挙型を表す文字列の配列ができました。

したがって、バンドルを復元するとき、私が試みているのは次のようなものです。

//Temporary string array
String[] tempStringArray = savedState.getStringArray("List");

//Temporary enum array
ObjectType[] tempEnumArray = new ObjectType[tempStringArray.length];

for (int i = 0; i<tempStringArray.length;i++){
    tempEnumArray[i]=ObjectType.valueOf(tempEnemies[i]);
}

これで、元々 ArrayList にあった各項目の列挙型が得られました。

私が今やろうとしているのは、次のようなものです(上記のforループ内に入ります):

myList.add(tempEnumArray[i].ObjectTypeThisEnumRefersTo());

明らかに、上記の「ObjectTypeThisEnumRefersTo()」メソッドは存在しませんが、これは最終的に私が見つけようとしているものです。これは可能ですか、それともおそらくこれを行う他の方法がありますか?

4

1 に答える 1

1

文字列から列挙型 Enemy の列挙値を取得するには、次を使用します。

Enemy.valueOf(String).

Enemy.valueOf("SPIDER") は、列挙型が次のようになっている場合、Enemy.SPIDER を返します。

enum Enemy { SPIDER,  BEE};

編集: Zippy にも Enemy オブジェクトの固定セットがあり、それぞれが EnemyType の各値にマッピングされており、特定の EnemyType から Enemy を見つける方法が必要でした。私の提案は、

HashMap<EnemyType, Enemy> 

作成時にすべてのオブジェクトをそこに配置し、逆シリアル化時に、ハッシュマップを使用して文字列を列挙値に変換し、列挙値を Enemy オブジェクトに変換します。

Enemy にどれだけのロジックがあるかによっては、Enemy または EnemyType のいずれかを破棄し、それらを 1 つのパラメーター化された列挙型に結合することを検討する必要があるかもしれないと後で思いつきました。 oracle.com/javase/tutorial/java/javaOO/enum.html これにより、文字列から最終的なオブジェクトまで 2 つの手順を実行する必要がなくなり、結局ハッシュマップが不要になるため、物事が少し単純化されます。

于 2015-03-13T21:20:50.670 に答える