我的目标是使用元素周期表(或列表)获取有关 Java 中特定元素的信息。我想通过原子序数和符号来搜索它(但这种转换应该很简单)。
我在 this JQuery plugin 中找到了该信息.但它存储为 JSON 文件。
似乎对信息进行硬编码是最有效的(因为它不会经常更改并且由于性能原因),但是如何将 JSON 转换为硬编码的 enum
?
最佳答案
开始于:
- 关于元素的信息是完全静态的
- 每个元素符号都是字母数字
- 新元素的发现既罕见又无关紧要(因为它们极不稳定)
枚举似乎是个不错的选择:
public enum Element {
H(1, "Hydrogen", 1.008, -259.1),
He(2, "Helium", 4.003, -272.2),
Li(3, "Lithium", 6.941, 180.5),
// ... 90+ others
;
private static class Holder {
static Map<Integer, Element> map = new HashMap<Integer, Element>();
}
private final int atomicNumber;
private final String fullName;
private final double atomicMass;
private final double meltingPoint;
private Element(int atomicNumber, String fullName, double atomicMass, double meltingPoint) {
this.atomicNumber = atomicNumber;
this.fullName = fullName;
this.atomicMass = atomicMass;
this.meltingPoint = meltingPoint;
Holder.map.put(atomicNumber, this);
}
public static Element forAtomicNumber(int atomicNumber) {
return Holder.map.get(atomicNumber);
}
public int getAtomicNumber() {
return atomicNumber;
}
public String getFullName() {
return fullName;
}
public double getAtomicMass() {
return atomicMass;
}
public double getMeltingPoint() {
return meltingPoint;
}
}
这里有一些 Java 功夫值得解释一下。 map 被放置在一个静态内部(持有者)类中,因此它在枚举实例初始化之前被初始化,这样它们就可以将自己添加到其中。如果不在内部静态类中,则不会被初始化,因为在枚举类中首先初始化的肯定是实例,而静态内部类在之前被初始化类已初始化。
这种方法意味着实例不需要以任何特定顺序列出(它们可以按字母顺序列出,或以其他方式列出)。
关于java - 元素周期表的数据结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22738023/