我想做一个国家枚举,我可以从中访问其状态,我该怎么做?
像这样的东西:
public enum SomeEnum {
ARGENTINA {
BUENOS_AIRES;
}
UNITED_STATES {
CALIFORNIA, FLORIDA, NEW_YORK, ALASKA;
}
}
SomeEnum state1 = SomeEnum.ARGENTINA.BUENOS_AIRES
SomeEnum state2 = SomeEnum.UNITED_STATES.CALIFORNIA;
Run Code Online (Sandbox Code Playgroud) 我是第一次使用EnumMap,并且不明白参数传递实际上在做什么.据我所知,它只是"K.class",其中K是地图键.这很好用,但我还没有在Java的其他任何地方看到这个,我不清楚它在构造中扮演的角色.
我想这是一个理论问题,因为代码运行:"K.class"参数意味着什么,以及EnumMap需要什么?
从一个s java.util.function.BiFunction映射Enum到一个值,我想构建一个EnumMap反映该映射.
例如,let E1和E2be是enum类型和T任何给定类型:
BiFunction<E1,E2, T> theBiFunction = //...anything
EnumMap<E1,EnumMap<E2,T>> theMap =
buildTheMap( // <-- this is where the magic happens
E1.values(),
E2.values(),
theBiFunction);
Run Code Online (Sandbox Code Playgroud)
给出任何类型E1和值的对E2
E1 e1 = //any valid value...
E2 e2 = //any valid value....
Run Code Online (Sandbox Code Playgroud)
以下两个值应相等:
T valueFromTheMaps = theMap.get(e1).get(e2);
T valueFromTheFunction = theBiFunction.apply(e1,e2);
boolean alwaysTrue = valueFromTheMaps.equals(valueFromTheFunction);
Run Code Online (Sandbox Code Playgroud)
" 神奇 "发生的方法的最佳(更优雅,更高效等)实现是什么?
private boolean isValidKey(Object key) {
if (key == null)
return false;
// Cheaper than instanceof Enum followed by getDeclaringClass
Class<?> keyClass = key.getClass();
return keyClass == keyType || keyClass.getSuperclass() == keyType;
}
Run Code Online (Sandbox Code Playgroud)
如上面方法的最后一行所示,为什么EnumMap实现会检查密钥的超类?如果没有任何东西可以从枚举中获得,为什么需要进行此项检查?
最近在读Java。所以我下面有一个枚举,它充当带有键“JESSIE”和值“我最喜欢的猫”的地图。
那么为什么有人需要使用 EnumMap 呢?谢谢
public enum Cat {
JESSIE("My favorite cat");
private String description;
Cat(String description){
this.description = description;
}
}
Run Code Online (Sandbox Code Playgroud) 我尝试使用一个简单的java EnumMap来存储道路类型到默认速度的映射.但是我立即遇到了以下问题:
我创建了一个简单的枚举如下:
public enum RoadCategory {
AUTOBAHN("Autobahn", 0),
BUNDESSTR("Bundesstrasse", 1),
OTHER("other", -1);
private String name;
private int code;
private RoadCategory(String name, int code){
this.name = name;
this.code = code;
}
}
Run Code Online (Sandbox Code Playgroud)
接下来,我创建了一个小类,试图将此枚举用作枚举映射的键:
import java.util.EnumMap;
import java.util.Map;
public class VehicleConfig {
public static void main(String[] args) throws Exception {
VehicleConfig v = new VehicleConfig();
v.addSpeedMapping(RoadCategory.AUTOBAHN, 80.0);
}
private Map<RoadCategory,Double> speedMap;
public VehicleConfig(){
this.speedMap = new EnumMap<RoadCategory, Double>(RoadCategory.class);
}
public double addSpeedMapping(RoadCategory category, double speed) throws Exception{
if(speedMap == null) …Run Code Online (Sandbox Code Playgroud) 我有一个Enum和一个EnumMap<Parameters, Byte>.
我将地图放入一个类中以隐藏"字节"值.所以我有一个set(Parameter, int)和set(Parameter, boolean)方法.
public enum Parameter {
BLAH
}
public class Parameters {
private final Map<Parameter, Byte> parameters = new EnumMap<>(Parameter.class);
public byte set(Parameter parameter, boolean set) {
return this.parameters.put(parameter, (byte) (set ? 0x01 : 0x00));
}
public byte set(Parameter parameter, int value) {
return this.parameters.put(parameter, (byte) value);
}
}
Run Code Online (Sandbox Code Playgroud)
当我打电话给任何一种方法时,NPW会提出哪一点put!如果我parameters公开并且直接调用方法它就可以了.
final Parameters parameters = new Parameters();
//parameters.parameters.put(Parameter.BLAH, (byte) 0x00);
parameters.set(Parameter.BLAH, false); // NPE
Run Code Online (Sandbox Code Playgroud)
任何人都可以向我解释这是对我的行为吗?
我正在研究 Java EnumMap 实现,发现如果我将空值传递给 EnumMap,EnumMap 会分配一个 Object 类对象来代替空值。
来自 EnumMap 类的代码:
public V put(K key, V value) {
typeCheck(key);
int index = key.ordinal();
Object oldValue = vals[index];
vals[index] = maskNull(value);
if (oldValue == null)
size++;
return unmaskNull(oldValue);
}
private Object maskNull(Object value) {
return (value == null ? NULL : value);
}
private static final Object NULL = new Object() {
public int hashCode() {
return 0;
}
public String toString() {
return "java.util.EnumMap.NULL";
}
};
Run Code Online (Sandbox Code Playgroud)
我的问题是为什么 java 放置一个对象而不是直接为给定的键分配空值。java 这样做有什么好处。
我想定义的扩展名,该扩展名enum class以与枚举常量相同的顺序接受值列表,并输出EnumMap。
相反,我能够做的是使用作为输入List<V>的键数组创建和扩展对象Enum<K>.values()。
看来困难enum class本身不是具有.values()方法的对象。因此,也许我的要求不明智。
这是一个使用列表扩展方法的工作示例。
import java.util.*
enum class Shoes(
val title: String,
val weight: Double) {
WORKBOOT("tough", 11.0),
SNEAKER("fast", 6.0),
SLIPPER("soft", 3.0);
}
fun main(args: Array<String>) {
val prices= listOf(11.5,8.2,3.5)
val map = prices.enumMapOf(Shoes.values())
map.print()
}
inline fun <reified K : Enum<K>, V> List<V>.enumMapOf(keys:Array<K>): EnumMap<K, V> {
val map = EnumMap<K, V>(K::class.java)
keys.forEachIndexed{i,k-> map[k]=this[i]}
return map
}
fun <K:Enum<K>,V> EnumMap<K,V>.print() {
this.forEach{k,v-> println("%d: %s --> %.2f".format(k.ordinal,k.name,v)) …Run Code Online (Sandbox Code Playgroud)