【问题标题】:How to compare array string value with enum values如何将数组字符串值与枚举值进行比较
【发布时间】:2020-06-09 09:09:20
【问题描述】:

这里我想知道如何将数组值等同于枚举值,而不考虑大小写。

enum Color{ RED, BLACK, WHITE, PINK}

public static void main{
  Scanner keyboard  = new Scanner(System.in);
  String input = keyboard next Line();
  String[] array = input.split(" ");
  for(int i=0; i<=array.length; i++){
     if("How to equate the array values to the enum values irrespective to the lowercase and upper case") 
      {
        System.out.print(array[i] + "is in the enum values");
      }
  }
}

用户输入:

orange red purple

输出应该是:

red is in the enum values

【问题讨论】:

  • if (array[i].equalsIgnoreCase(Color.RED.toString())) 这样的东西怎么样?作为替代方案,您可以通过特定的 String 值扩展 enum,但它不会保持单线...
  • @deHaar 我会建议name() 而不是toString(),但它有效
  • @f1sh 谢谢,最好使用name(),对...
  • @f1sh from Enum::name javadocs:大多数程序员应该优先使用 toString() 方法,因为 toString 方法可能会返回一个对用户更友好的名称。
  • @Mr.Robot 是的,但这正是这里的问题。您不想将"RED" 与“更用户友好的名称”或任何可能被覆盖的toString() 返回进行比较,但您想将其与枚举常量名称进行比较,这正是name() 返回的内容。

标签: java arrays enums


【解决方案1】:

你可以使用name()枚举方法。

在 if 条件下你可以使用这个条件。

array[i].toUpperCase().equals(Color.RED.name())

如果你想迭代枚举值,那么你可以使用values()

for(String color: Color.values()){
    // Your code
}

【讨论】:

    【解决方案2】:

    用 lambda 一行一行的把它们全挑出来:

    List<String> wanted = Arrays.stream(Color.values())
    .filter(color->Arrays.asList(array).contains(color.name()))
    .map(Color::name).collect(Collectors.asList());
    

    或者直接打印出来

    System.out.println(Arrays.stream(Color.values())
    .filter(color -> Arrays.asList(array).contains(color.name()))
    .map(Color::name).collect(Collectors.joining(",")));
    

    【讨论】:

      【解决方案3】:

      你可以用这个:

           public static void main(String[] args) {
      
                 Scanner keyboard  = new Scanner(System.in);
                 String input = keyboard.nextLine();
                 String[] array = input.split(" ");
                 for(int i=0; i<array.length; i++){
                    if(array[i].equalsIgnoreCase(Color.RED.name()) || 
                            array[i].equalsIgnoreCase(Color.BLACK.name()) ||
                            array[i].equalsIgnoreCase(Color.WHITE.name()) ||
                            array[i].equalsIgnoreCase(Color.PINK.name())) {
                       System.out.print(array[i] + "is in the enum values");
                     }
      
           }
      
      
      
                 }
              enum Color{ RED, BLACK, WHITE, PINK};
               }
      

      你也遇到了 for(int i=0; i&lt;=array.length; i++) 的问题,你需要将其更改为 i&lt;array.length ,因为它给出了 java.lang.ArrayIndexOutOfBoundsException 的错误。

      输出:

      orange red purple
      red is in the enum values
      
      orange purple black
      black is in the enum values
      
      white hello world
      white is in the enum values
      

      【讨论】:

        【解决方案4】:

        您可以定义一个枚举类来完成比较工作。

        public enum Color {
        //red
        RED("red"),
        //black
        BLACK("black"),
        //white
        WHITE("white"),
        //pink
        PINK("pink");
        
        private String desc;
        
        Color(String desc) {
            this.desc = desc;
        }
        
        public static boolean isExist(String color) {
            for (Color c : Color.values()) {
                if (c.desc.compareTo(color) == 0) {
                    return true;
                }
            }
            return false;
        }}
        

        以下是主要方法。

        public static void main(String[] args) {
            Scanner keyboard = new Scanner(System.in);
            String input = keyboard.nextLine();
            String[] array = input.split(" ");
            for (String s : array) {
                if (Color.isExist(s.toLowerCase())) {
                    System.out.print(s + " is in the enum values");
                }
            }
        }
        

        ps:

        for (int i=0; i<=array.length; i++) {}
        

        会抛出java.lang.ArrayIndexOutOfBoundsException。你可以写下面两个方法。

        for (int i=0; i<array.length;i++) {}
        or    
        for (String s : array) {}
        

        【讨论】:

          【解决方案5】:

          使用String#joinStream API 的解决方案:

          import java.util.Scanner;
          import java.util.stream.Collectors;
          import java.util.stream.Stream;
          
          enum Color {
              RED, BLACK, WHITE, PINK
          }
          
          public class Main {
              public static void main(String[] args) {
                  Scanner keyboard = new Scanner(System.in);
                  String input = keyboard.nextLine();
                  String values = String.join("", Stream.of(Color.values()).map(c -> c.name()).collect(Collectors.toList()));
                  for (String s : input.split("\\s+")) {
                      if (values.contains(s.toUpperCase())) {
                          System.out.print(s + " is in the enum values");
                      }
                  }
              }
          }
          

          输出:

          orange red purple
          red is in the enum values
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多