首页 文章

将Enum值转换为逗号分隔String的最有效方法

提问于
浏览
-1

我有一个java类,我在其中存储一个枚举 . (显示在这个问题的底部)在这个枚举中,我有一个名为 toCommaSeperatedString() 的方法,它返回逗号分隔的枚举值String . 我在这个问题here中阅读了一些有关性能的信息后,我正在使用StringBuilder .

我将这个枚举值转换为commaSeperatedString的方式是这样做的最有效方式,如果是这样,那么在String的最后一个字符处删除额外逗号的最有效方法是什么?

例如,我的方法返回 123, 456, 但是我更喜欢 123, 456 . 如果我想返回 PROPERTY1, PROPERTY2 我可以轻松使用Apache Commons库StringUtils.join(),但是,当我遍历String数组时,我需要通过调用 getValue 方法来降低一级 .

public class TypeEnum {
    public enum validTypes {
        PROPERTY1("123"),
        PROPERTY2("456");

        private String value;

        validTypes(String value) {
            this.value = value;
        }

        public String getValue() {
            return value;
        }

        public static boolean contains(String type) {
            for (validTypes msgType : validTypes.values()) {
                if (msgType.value.equals(type)) {
                    return true;
                }
            }
            return false;
        }

        public static String toCommaSeperatedString() {
            StringBuilder commaSeperatedValidMsgTypes = new StringBuilder();
            for(validTypes msgType : validTypes.values()) {
                commaSeperatedValidMsgTypes.append(msgType.getValue() + ", ");
            }
            return commaSeperatedValidMsgTypes.toString();
        }
    }
}

4 回答

  • 2

    我不担心效率 . 只要你不以疯狂的方式做到这一点就足够简单了 . 如果这是代码中最重要的性能瓶颈,我会感到惊讶 .

    我会做这样的事情:

    return Arrays.stream(TypeEnum.values())
          .map(t -> t.value)
          .collect(Collectors.joining(','));
    

    如果你想要缓存它;但这可能不会产生巨大的影响 .

  • 10

    我看到的尾随逗号问题的常见模式是类似的

    String[] values = {"A", "B", "C"};
    boolean is_first = true;
    StringBuilder commaSeperatedValidMsgTypes = new StringBuilder();
    for(String value : values){
        if(is_first){
            is_first = false;
        }
        else{
            commaSeperatedValidMsgTypes.append(',');
        }
        commaSeperatedValidMsgTypes.append(value);
    }
    System.out.println(commaSeperatedValidMsgTypes.toString());
    

    结果

    A,B,C
    

    将此与使用静态块初始化静态最终字段的答案相结合可能会提供最佳性能 .

  • 2

    最有效的代码是不会改变的代码,因此在创建枚举时,只需运行一次代码即可 . 点击一次,每隔一次有人要求返回计算出的答案 . 从长远来看,这样做可以节省更多费用,而不必担心如何专门构建字符串,因此请使用最清楚的内容(编写供人类阅读的代码) .

    例如:

    public enum ValidTypes {
    
        PROPERTY1("123"),
        PROPERTY2("345");
    
        private final static String asString = calculateString();
        private final String value;
    
        private static String calculateString() {
            return // Do your work here.
        }
    
        ValidTypes(final String value) {
            this.value = value;
        }
    
        public static String toCommaSeparatedString() {
            return asString;
        }
    }
    
  • 2

    如果你必须在短时间内调用这种静态方法一千零一千次,你可能会担心性能,你应该首先检查这是否有性能成本 .
    JVM在运行时执行许多优化 .
    所以最后你可以编写更复杂的代码而不增加 Value .


    无论如何,你应该做的实际事情是存储 toCommaSeperatedString 返回的 String 并返回相同的实例 .
    枚举是常数值 . 所以缓存它们不是问题 .

    您可以使用静态初始值设定项来指定静态字符串字段 .
    关于 , 字符,只需在循环后删除它 .

    public enum validTypes {
    
    PROPERTY1("123"), PROPERTY2("456");
    
    private static String valueSeparatedByComma;
    
    static {
        StringBuilder commaSeperatedValidMsgTypes = new StringBuilder();
        for (validTypes msgType : validTypes.values()) {
            commaSeperatedValidMsgTypes.append(msgType.getValue());
            commaSeperatedValidMsgTypes.append(",");
        }
    
        commaSeperatedValidMsgTypes.deleteCharAt
        (commaSeperatedValidMsgTypes.length()-1);
        valueSeparatedByComma = commaSeperatedValidMsgTypes.toString();
    }
    
    public static String getvalueSeparatedByComma() {
        return valueSeparatedByComma;
    }
    

相关问题