Java 如果与给定字符串匹配,如何返回枚举

Java 如果与给定字符串匹配,如何返回枚举,java,jakarta-ee,enums,enumeration,enumerate,Java,Jakarta Ee,Enums,Enumeration,Enumerate,我有下面给出的枚举类 public enum AlgorithmEnum { SHA512("RSA", "SHA512", 1), SHA1("RSA", "SHA1", 1), SHA384("RSA", "SHA384", 1); private String keyAlgorithm; private String hashAlgorithm; private Integer key; private AlgorithmEnum(String

我有下面给出的枚举类

public enum AlgorithmEnum {

    SHA512("RSA", "SHA512", 1), SHA1("RSA", "SHA1", 1), SHA384("RSA", "SHA384", 1);

    private String keyAlgorithm;
    private String hashAlgorithm;
    private Integer key;

    private AlgorithmEnum(String keyAlgorithm, String hashAlgorithm, Integer key) {
        this.keyAlgorithm = keyAlgorithm;
        this.hashAlgorithm = hashAlgorithm;
        this.key = key;
    }

    public String getKeyAlgorithm() {
        return keyAlgorithm;
    }

    public void setKeyAlgorithm(String keyAlgorithm) {
        this.keyAlgorithm = keyAlgorithm;
    }

    public String getHashAlgorithm() {
        return hashAlgorithm;
    }

    public void setHashAlgorithm(String hashAlgorithm) {
        this.hashAlgorithm = hashAlgorithm;
    }

    public Integer getKey() {
        return key;
    }

    public void setKey(Integer key) {
        this.key = key;
    }
}
我需要像下面这样的方法,它将输入作为字符串并返回Enum

public AlgorithmEnum getAlgorithm(String algorithm){
        //returns AlgorithmEnum object
    }
我将通过传递“SHA512withRSA”作为getAlgorithm方法的输入来调用上述方法


我需要实现getAlgorithm方法的帮助。

假设传递给方法的所有字符串值
getAlgorithm()
withRSA
结尾,您可以使用以下方法获取枚举值:

public AlgorithmEnum getAlgorithm(String algorithm) {
    return AlgorithmEnum.valueOf(algorithm.substring(0, algorithm.indexOf("withRSA")));
}

假设所有传递给方法
getAlgorithm()
的字符串值都以
withRSA
结尾,则可以使用以下方法获取枚举值:

public AlgorithmEnum getAlgorithm(String algorithm) {
    return AlgorithmEnum.valueOf(algorithm.substring(0, algorithm.indexOf("withRSA")));
}

您可以选择以下内容:

public static AlgorithmEnum getAlgorithm(final String algorithm)
        throws IllegalArgumentException
    {
        for (final AlgorithmEnum algorithmEnum : AlgorithmEnum.values())
        {
            if (algorithm.equalsIgnoreCase(String.format("%swith%s", algorithmEnum.getHashAlgorithm(), algorithmEnum.getKeyAlgorithm())))
            {
                return algorithmEnum;
            }
        }
        throw new IllegalArgumentException("Unknown algorithm: " + algorithm);
    }

但是,我不建议使用这种方法。而是使用两个不同的参数,而不是单个字符串

您可以有如下功能:

public static AlgorithmEnum getAlgorithm(final String algorithm)
        throws IllegalArgumentException
    {
        for (final AlgorithmEnum algorithmEnum : AlgorithmEnum.values())
        {
            if (algorithm.equalsIgnoreCase(String.format("%swith%s", algorithmEnum.getHashAlgorithm(), algorithmEnum.getKeyAlgorithm())))
            {
                return algorithmEnum;
            }
        }
        throw new IllegalArgumentException("Unknown algorithm: " + algorithm);
    }

但是,我不建议使用这种方法。而是使用两个不同的参数,而不是单个字符串

您可以检查给定的
字符串
是否包含与某些
if
语句匹配的
enum
属性之一的值:

public AlgorithmEnum getAlgorithm(String algorithm) {
    if (algorithm.contains("SHA1")) {
        return SHA1;
    } else if (algorithm.contains("SHA512")) {
        return SHA512;
    } else if (algorithm.contains("SHA384")) {
        return SHA384;
    } else {
        return null;
    }
}
请注意,这也将匹配
字符串
s,如
“sha512without rsa”

也许是一种像

public AlgorithmEnum getAlgorithm(String keyAlgorithm, String hashAlgorithm)

那就更好了。但是,您必须提供两个参数。

您可以检查给定的
字符串
是否包含与某些
if
语句的
枚举
属性之一相匹配的值:

public AlgorithmEnum getAlgorithm(String algorithm) {
    if (algorithm.contains("SHA1")) {
        return SHA1;
    } else if (algorithm.contains("SHA512")) {
        return SHA512;
    } else if (algorithm.contains("SHA384")) {
        return SHA384;
    } else {
        return null;
    }
}
请注意,这也将匹配
字符串
s,如
“sha512without rsa”

也许是一种像

public AlgorithmEnum getAlgorithm(String keyAlgorithm, String hashAlgorithm)

那就更好了。但是,您必须提供两个参数。

我给您举一个例子,说明我在类似情况下是如何做到的,您可以轻松地根据自己的需要进行调整:

private static Map<Integer, YourEnum> valuesById = new HashMap<>();
private static Map<String, YourEnum> valuesByCode = new HashMap<>();

    static {
        Arrays.stream(YourEnum.values()).forEach(value -> valuesById.put(value.reasonId, value));
        Arrays.stream(YourEnum.values()).forEach(value -> valuesByCode.put(value.reasonCode, value));
    }


    public static YourEnum getByReasonId(int endReason) {
        return valuesById.get(endReason);
    }
private static Map valuesById=new HashMap();
私有静态映射值bycode=newhashmap();
静止的{
Arrays.stream(YourEnum.values()).forEach(value->valuesById.put(value.reasonId,value));
Arrays.stream(YourEnum.values()).forEach(value->valuesByCode.put(value.reasonCode,value));
}
公共静态YourEnum getByReasonId(int-endReason){
返回值ById.get(endReason);
}

我给大家举一个我在类似案例中所做的示例,您可以轻松地根据自己的需要进行调整:

private static Map<Integer, YourEnum> valuesById = new HashMap<>();
private static Map<String, YourEnum> valuesByCode = new HashMap<>();

    static {
        Arrays.stream(YourEnum.values()).forEach(value -> valuesById.put(value.reasonId, value));
        Arrays.stream(YourEnum.values()).forEach(value -> valuesByCode.put(value.reasonCode, value));
    }


    public static YourEnum getByReasonId(int endReason) {
        return valuesById.get(endReason);
    }
private static Map valuesById=new HashMap();
私有静态映射值bycode=newhashmap();
静止的{
Arrays.stream(YourEnum.values()).forEach(value->valuesById.put(value.reasonId,value));
Arrays.stream(YourEnum.values()).forEach(value->valuesByCode.put(value.reasonCode,value));
}
公共静态YourEnum getByReasonId(int-endReason){
返回值ById.get(endReason);
}

添加一个getter并比较它们没有使用
SHA512withRSA定义枚举常量。您希望它如何返回值?所有字符串是否都有以RSA
结尾的语法?请在将问题发布到SO上之前添加您尝试执行但失败的代码。添加一个getter并将其进行比较没有使用RSA定义枚举常量。您希望它如何返回值?所有字符串是否都以RSA结尾?请在实际发布问题之前添加您尝试执行但失败的代码。