元素周期表的数据结构

fel*_*ixd 1 java enums cheminformatics

我的目标是使用元素周期表(或列表)来获取有关Java中特定元素的信息.我想通过原子序数和符号进行搜索(但转换应该很简单).

我在这个JQuery插件中找到了这些信息.但它存储为JSON文件.

看起来硬编码信息是最有效的(因为它不会经常更改并且由于性能原因),但是如何将JSON转换为硬编码enum

Boh*_*ian 6

以来:

  • 关于元素的信息是完全静态的
  • 每个元素符号都是字母数字
  • 新元素的发现既罕见又无关紧要(因为它们非常不稳定)

枚举似乎是个不错的选择:

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

这里有一些java功夫,值得一解.映射放在一个静态内部(holder)类中,因此它在枚举实例初始化之前被初始化,这样他们就可以将它们添加到它中.如果不在内部静态类中,则不会初始化,因为在枚举类中初始化的第一件事必须是实例,但是在初始化类之前初始化静态内部类.

这种方法意味着实例不需要以任何特定顺序列出(它们可以按字母顺序列出,或者以其他方式列出).