首页 > 解决方案 > 如何使用从数据库中检索的值创建 HashMap?

问题描述

我有一个数据库列,其中包含从 0 到 10 的值基于从数据库检索到的值,我需要创建一个 HashMap

示例:如果我得到 0 到 6 的值,我需要在 HashMap 中存储 'sad' 如果我得到 7 到 8 的值,我需要在 HashMap 中存储 'ok' 如果我得到 9 到 10 的值,我需要在 HashMap 中存储“快乐”

我知道一种方法

if (value.equals("1") || value.equals("2") || value.equals("3")..... || value.equals("6"){
map.put (value,"sad")
}
else if (value.equals("7") || value.equals("8")){
map.put(value, "ok")
} else{
map.put(value, "happy")
}

我不确定这是否是正确的方法?因为如果从 0 到 50 有更多的值,那会很麻烦。有没有更好的方法呢?

标签: javaalgorithmdesign-patternsenumsfunctional-interface

解决方案


你可以使用 Java enum。定义一个enum包含所有链接到相关号码的消息映射。然后在此枚举中创建一个 API,以反向查找包含特定数字的枚举常量,并使用该 API 来解析要放入地图的内容。

下面是这个方法的一个工作演示,你可以运行它来看看它是如何工作的:

import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
import java.util.stream.Stream;

public class EnumSelector {

    public static void main(String[] args) {
        Map<Integer, String> store = new HashMap<>();

        store.computeIfAbsent(1, EmotionalState::findLabel);
        store.computeIfAbsent(4, EmotionalState::findLabel);
        store.computeIfAbsent(8, EmotionalState::findLabel);
        store.computeIfAbsent(10, EmotionalState::findLabel);
        store.computeIfAbsent(35, EmotionalState::findLabel);
        store.computeIfAbsent(0, EmotionalState::findLabel);
        store.computeIfAbsent(40, EmotionalState::findLabel);
        store.computeIfAbsent(25, EmotionalState::findLabel);
        store.computeIfAbsent(33, EmotionalState::findLabel);
        store.computeIfAbsent(55, EmotionalState::findLabel);
        store.computeIfAbsent(-1, EmotionalState::findLabel);
        store.computeIfAbsent(100, EmotionalState::findLabel);

        System.out.println(store);
    }

    public static enum EmotionalState {
        NULL("Null"), // No levels
        SINGLE("Single", 0), // Single level of 0
        COMBO_ENUM("Combo", 20, 30, 40, 50, 60), // From 20-30 + 40, 50, 60
        ENUMERATED("Enumerated", 33, 33, 28, 55), // From 33-33 + 28, 55

        SAD("Sad", 1, 6), 
        OK("Ok", 7, 8), 
        HAPPY("Happy", 9, 15),
        DEFAULT_STATE("Default");

        private String name;
        private List<Integer> levels;

        EmotionalState(String name, int... levels) {
            this.name = name;

            // The first two values will be considered as range
            IntStream initialStream = (levels.length < 2) ? 
                    Arrays.stream(levels) : // Single value
                    IntStream.range(levels[0], levels[1] + 1); // Range of values

            this.levels = initialStream
                    .mapToObj(Integer::new)
                    .collect(Collectors.toList());

            // Add remaining values as literals
            if (levels.length > 2)
                Arrays.stream(Arrays.copyOfRange(levels, 2, levels.length))
                    .mapToObj(Integer::new)
                    .forEach(this.levels::add);
        }

        public String getName() {
            return name;
        }

        public boolean containsLevel(int level) {
            return levels.stream()
                    .filter(l -> l.intValue() == level)
                    .findAny()
                    .isPresent();
        }

        public static EmotionalState findFor(int level) {
            return Stream.of(EmotionalState.values())
                    .filter(en -> en.containsLevel(level))
                    .findAny()
                    .orElse(DEFAULT_STATE);
        }

        public static String findLabel(String level) {
            return findLabel(Integer.parseInt(level));
        }

        public static String findLabel(int level) {
            return EmotionalState.findFor(level).getName();
        }
    }
}

GitHub上的完整代码

希望这可以帮助。


推荐阅读