java - 如何使用从数据库中检索的值创建 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 有更多的值,那会很麻烦。有没有更好的方法呢?
解决方案
你可以使用 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();
}
}
}
希望这可以帮助。
推荐阅读
- sass - SCSS/SASS 删除输出中的 CSS 行?
- c++ - 使用 < 从文本文件中读取参数
- android - 我正在尝试在 Android Native-activity 中使用 opengles 绘制对象,但我什么也没看到
- flutter - 运行颤振医生时无法接受 android 许可证
- html - 响应式移动导航 css
- python - 在数据框中为所有列项创建单独的类变量
- python - 计算用于按 QuickSort、Python 排序的比较次数
- vue.js - 如何在 Vuejs 中并排显示 vx-cards
- javascript - 当我要将地图索引传递给我的组件时,对未定义参数的任何帮助
- python - 如何使用 exchangelib 按 email_address 域过滤?