Java将扫描仪输入与ENUM进行比较

时间:2015-11-16 19:03:59

标签: java string enums java.util.scanner

我试图通过将字符串(来自Scanner)的结果与潜在值的枚举进行比较来获得输入验证。

Enum包含世界上所有国家/地区的名称,要求用户输入国家/地区名称 - 只有在Enum中存在输入值时才允许输入 - 是否有办法执行此操作?

谢谢!

5 个答案:

答案 0 :(得分:2)

最有效的方法是尝试按名称获取Enum并使用Enum.valueOf(String)方法捕获异常:

"INSERT INTO upcomuser_lv (id, user, month, date_start, date_end, sick, holiday, comp, military)
VALUES         ('id', '$user', 'November', '2015-11-1', '2015-11-30', '8', '24', '0', '0' ),
               ('id','$user','December', '2015-12-1', '2015-12-31', '8', '16', '16', '0'),
               ('id','$user','Janruary', '2016-1-1', '2016-1-31', '8', '16', '0', '0'),
               ('id','$user','February', '2016-2-1', '2016-2-29', '8', '8', '0', '0'),
               ('id','$user','March', '2015-3-1', '2015-3-31', '8', '0', '0', '0' ),
               ('id','$user','April', '2015-4-1', '2015-4-30', '8', '0', '0', '0'),
               ('id','$user','May', '2016-5-1', '2016-5-31', '8', '8', '0', '0'),
               ('id','$user','June', '2016-6-1', '2016-6-30', '8', '0', '0', '0'),
               ('id','$user','July', '2015-7-1', '2015-7-31', '8', '8', '0', '0' ),
               ('id','$user','August', '2015-8-1', '2015-8-31', '8', '0', '0', '0'),
               ('id','$user','September', '2016-9-1', '2016-9-30', '8', '0', '0', '120'),
               ('id','$user','October', '2016-10-1', '2016-10-31', '8', '0', '0', '0'),
ON DUPLICATE KEY UPDATE user=VALUES('user'), month=VALUES('month'), date_start=VALUES('date_start'), date_end=VALUES('date_end'), sick=VALUES('sick'), holiday=VALUES('holiday'), comp=VALUES('comp'), military=VALUES('military')";

另一种不捕获异常的方法是将用户输入与每个枚举值进行比较:

try {
    CountryEnum country = CountryEnum.valueOf( "user-input" );
} catch ( IllegalArgumentException e ) {
    System.err.println( "No such country" );
}

答案 1 :(得分:1)

如果字符串值作为类型枚举

存在,请使用Enum.valueOf("string") != null

在此处查找更多参考资料 - http://www.tutorialspoint.com/java/lang/enum_valueof.htm

答案 2 :(得分:0)

以下应该工作

public class EnumTest {
    enum Country{IND, AUS, USA;
        static boolean exists(String key) {
            Country[] countryArr = values();

            boolean found = false;
            for(Country country : countryArr) {
                if(country.toString().equals(key)) {
                    found = true;
                    break;
                }
            }

            return found;
        }
    };

    public static void main(String[] args) {
        System.out.println("Started");
        Scanner scan = new Scanner(System.in);
        System.out.println(Country.exists(scan.nextLine()));
        scan.close();
    }
}

当然,您可以使用Set来存储值,从而实现更高效的搜索。 当传递的值与任何枚举常量不匹配时,无法使用Enum.valueOf,因为它抛出异常。

java.lang.IllegalArgumentException: No enum constant

答案 3 :(得分:0)

如果Enum没有给定名称的相应值,您可以为Enum配备一个方法getByName(String name),该方法返回null

public enum Country {

    AFGHANISTAN,
    ALBANIA,
    ALGERIA,
    ...

    public static Country getByName(String name) {

        try {
            return valueOf(name.toUpperCase());
        } catch (IllegalArgumentException e) {
            return null;
        }
    }
}

现在,当用户输入“Neverland”时,显然getByName('Neverland')会返回null,您可以对其进行测试。您可以在列表中包含全部值,而不是null,而不是TERRAINCOGNITA<div ng-repeat="item in items"> <h3>{{item.title}}</h3> <a href="" ng-click="addToWishlist(item)" ng-if="!(item.wishlists|filter:{user_id:user.id}).length">Wish</a> <a href="" ng-click="removeFromWishlist(item)" ng-if="(item.wishlists|filter:{user_id:user.id}).length">Undo-Wish</a> </div>

答案 4 :(得分:0)

public enum RegisterType {GUIDE, VISITOR, TICKET, RECEPTIONIEST;}

RegisterType type = RegisterType.valueOf(input.next());