【问题标题】:Check if a list of Enums contains a String in Java检查枚举列表是否包含Java中的字符串
【发布时间】:2018-10-07 17:00:38
【问题描述】:

我有一个具有一种属性类型的对象列表。我想过滤该列表以仅包含其值在枚举列表中的那些对象。

这是上面描述的 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());
    }
}

我只想保留那些属于枚举列表一部分的播放器列表中的项目。以上似乎不起作用。请提出一种方法来实现这一点。我在 Java 8 中这样做。

【问题讨论】:

  • getType的返回类型是什么?
  • 它是一个字符串。

标签: java list enums compare string-comparison


【解决方案1】:

据我所知,有两种方法:

*不要使用枚举创建玩家类型列表,而是使用枚举名称:

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方法,将从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());
    }
}

【讨论】:

    【解决方案2】:

    你的枚举甚至没有编译。一旦你得到了一个可以正常工作的最小完整示例,你只需要使用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(无论出于何种原因)。所以这需要查找枚举类型(或者只使用Set&lt;String&gt; playerTypes)。

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

    【讨论】:

    • 我直接在这里输入代码,是为了让我知道我在做什么。您的代码作为 Player 类成员 type 本身是 Enum,在我的情况下,它是 String 类型。
    • @AtulKumarVerma “关于我在做什么的一些想法”对于这样的编程问题不是很有用。
    • 感谢您的建议。一定会照顾好。
    【解决方案3】:

    如果你想查找一个 Enum 是否有一个字符串,我会在我们的 Enum 中添加一个 Hashmap 并将我们的值作为键添加。这样,我可以做一个简单的 get 并检查它是否存在。

    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;
        }
    
    }
    

    然后,您需要做的就是使用 Enum 的 containsString 方法检查字符串是否存在。

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

    我已经尝试过这段代码,它按预期工作。如果有帮助,请告诉我。

    【讨论】:

      猜你喜欢
      • 2011-06-23
      • 2014-08-09
      • 1970-01-01
      • 1970-01-01
      • 2012-06-03
      • 1970-01-01
      • 2012-08-30
      • 2020-02-26
      • 1970-01-01
      相关资源
      最近更新 更多