2016-04-01 4 views
2

In meiner Situation, bei einer Enum, überprüfen Sie, ob diese Enum zu einer bestimmten Liste von enums gehört oder nicht.Effizienz bei der Verwendung einer Arraylist der Enum für die Überprüfung der Bedingung

Meine Lösung besteht darin, alle Enums, die ich mit der angegebenen Enum vergleichen möchte, in eine ArrayList zu schreiben. Also kann ich die Methode contains (..) der ArrayList verwenden, um die Aufgabe zu überprüfen.

PokemonEnums givenPokemon = ...; 

ArrayList<PokemonEnums> AshPokemonList = ...; 

while(doing something){ 
     if(AshPokemonList.contains(givenPokemon){ 
      //do fun stuffs 
     } 
} 

Ist es akzeptabel, in der Bezeichnung der Leistung oder gibt es eine andere Art, wie ich dies in einer elegantere Art und Weise tun?

P/S: Obwohl ich weiß, dass AshPokemonList wird wahrscheinlich nicht mehr 10 enthalten, kann ich verwenden, wenn mit mehreren Prüfungen, aber dann sieht es ziemlich chaotisch für mich. Aber ich weiß nicht in Bezug auf die Leistung, wird es besser sein?

+2

Wie wäre es mit EnumSet? –

+0

verschieben Sie einfach den Test außerhalb der Weile, nein? –

Antwort

6

Java bietet einen speziellen Behälter EnumSet<T> genannt, die für die Arbeit mit enum s optimiert ist:

PokemonEnums givenPokemon = ...; 
EnumSet<PokemonEnums> ashPokemonSet = ...; 
while(doing something){ 
     if(ashPokemonSet.contains(givenPokemon) { 
      //do fun stuffs 
     } 
} 

Diese Implementierung als eine Array-Liste besser sein sollte, weil es Bitvektoren intern verwendet:

Enumsätze werden intern als Bitvektoren dargestellt. Diese Darstellung ist äußerst kompakt und effizient. Die Raum- und Zeitleistung dieser Klasse sollte gut genug sein, um ihre Verwendung als hochwertige, typsichere Alternative zu herkömmlichen Int-basierten "Bit-Flags" zu ermöglichen.

3

Nein, es ist nicht "akzeptabel", weil dies eine lineare Komplexität hat, so dass die Laufzeit von der Länge der Liste abhängt. Verwenden Sie stattdessen eine EnumSet. Diese Klasse ist nicht sortiert, aber Sie können in konstanter Zeit überprüfen, ob eine Enum enthalten ist, egal wie groß die Menge ist.

0

Bitte verwenden Sie EnumSet: https://docs.oracle.com/javase/7/docs/api/java/util/EnumSet.html. Es ist etwas speziell für Enums erstellt. Sowohl im Hinblick auf den Raum als auch auf die Leistung ist es sehr gut.

Copy-Einfügen aus der API:

Eine spezielle Set-Implementierung für die Verwendung mit Enum-Typen. Alle -Elemente in einem Aufzählungssatz müssen aus einem einzelnen Aufzählungstyp stammen, der explizit oder implizit bei der Erstellung des Satzes angegeben wird. Enum Sätze werden intern als Bitvektoren dargestellt. Diese Darstellung ist extrem kompakt und effizient. Die Raum- und Zeitleistung von Diese Klasse sollte gut genug sein, um ihre Verwendung als hochwertige, typsichere Alternative zu herkömmlichen Int-basierten "Bit-Flags" zu ermöglichen. Sogar Bulk Operationen (wie ContainsAll und RetainAll) sollten sehr schnell ausgeführt werden, wenn ihr Argument auch eine Aufzählung ist.

Verwandte Themen