Проверьте, содержит ли список Enums строку в Java - PullRequest
0 голосов
/ 07 октября 2018

У меня есть список объектов с одним типом атрибута.Я хочу отфильтровать этот список, чтобы он содержал только те объекты, значение которых есть в списке Enum.

Вот простая версия Java-программы, описанная выше.

public enum Types {SLOW("Slow"), FAST("Fast"), VERY_FAST("Running");}
List<Types> playerTypes = new ArrayList<>();
playerTypes.add(Types.SLOW);
List<Player> myPlayers = new ArrayList<>();
Player player = new Player("FAST");
myPlayers.add(player);
for (Player p : myPlayers) {
    if(playerTypes.contains(p.getType())) {
       System.out.println("Player type is : " + p.getType());
    }
}

Я хочу сохранитьтолько те элементы в списке игроков, которые являются частью списка enum.Выше, похоже, не работает.Пожалуйста, предложите способ достичь этого.Я делаю это в Java 8.

Ответы [ 3 ]

0 голосов
/ 07 октября 2018

По моему мнению, есть два способа:

* Вместо создания списка типов игроков с перечислениями используйте имена перечислений:

public enum Types {
    SLOW("Slow"), FAST("Fast"), VERY_FAST("Running");
}
List<String> playerTypes = new ArrayList<>();
playerTypes.add(Types.SLOW.name());
List<Player> myPlayers = new ArrayList<>();
Player player = new Player("FAST");
myPlayers.add(player);
for (Player p : myPlayers) {
    if(playerTypes.contains(p.getType())) {
       System.out.println("Player type is : " + p.getType());
    }
}

* Вы можете использовать valueOf метод класса enum для преобразования строки, полученной из p.getType() в Enum:

public enum Types {
    SLOW("Slow"), FAST("Fast"), VERY_FAST("Running");
}
List<Types> playerTypes = new ArrayList<>();
playerTypes.add(Types.SLOW);
List<Player> myPlayers = new ArrayList<>();
Player player = new Player("FAST");
myPlayers.add(player);
for (Player p : myPlayers) {
    if(playerTypes.contains(Types.valueOf(p.getType()))) {
       System.out.println("Player type is : " + p.getType());
    }
}
0 голосов
/ 07 октября 2018

Если вы хотите узнать, есть ли в Enum строка, я бы добавил Hashmap в наш Enum и добавил бы наше значение в качестве ключа.Таким образом, я могу просто получить и проверить, существует ли он.

public enum PlayerSpeed {

    // Type of speeds.
    SLOW("Slow"),
    FAST("Fast"),
    VERY_FAST("Running");

    // String value that represents each type of speed.
    public final String value;
    // Hash map that let us get a speed type by it's String value.
    private static Map map = new HashMap<>();

    // Private constructor.
    private PlayerSpeed(String value) { this.value = value; }

    // Fill our hash map.
    static {
        for (PlayerSpeed playerSpeed : PlayerSpeed.values()) {
            map.put(playerSpeed.value, playerSpeed);
        }
    }

    /**
     * Given a string, look it up in our enum map and check if it exists.
     * @param searchedString String that we are looking for.
     * @return True if the string is found.
     */
    public static boolean containsString(String searchedString) {
        return map.get(searchedString) != null;
    }

}

Затем все, что вам нужно сделать, это проверить, существует ли String, используя метод containsString нашего Enum.

Player player = new Player("FAST");
if(PlayerSpeed.constainsString(p.getType())) {
   System.out.println("Player type is : " + p.getType());
}

Я уже пробовал этот код, и он работает как задумано.Пожалуйста, дайте мне знать, если это поможет.

0 голосов
/ 07 октября 2018

Ваш enum даже не компилируется.Как только у вас получится минимальный законченный пример, который в противном случае работает, вам просто нужно использовать Collections.removeIf.

import java.util.*;
import java.util.stream.*;

enum PlayerType {
    SLOW, FAST, VERY_FAST
}
class Player {
    private final PlayerType type;
    public Player(PlayerType type) {
        this.type = type;
    }
    public PlayerType type() {
        return type;
    }
    @Override public String toString() {
        return type.name();
    }
}
interface Play {
   static void main(String[] args) {
       Set<PlayerType> playerTypes = EnumSet.of(
           PlayerType.SLOW
       );
       List<Player> myPlayers = new ArrayList<>(Arrays.asList(
          new Player(PlayerType.FAST)
       ));
       myPlayers.removeIf(player -> !playerTypes.contains(player.type()));
       System.err.println(myPlayers);
   }
}

Обновление: На оригинальном плакате сказано, Player сохраняет тип вString (по любой причине).Так что это нужно будет найти в типе enum (или просто использовать Set<String> playerTypes).

   myPlayers.removeIf(player -> 
       !playerTypes.contains(PlayerType.valueOf(player.type()))
   );
...