java - 元素周期表的数据结构

标签 java enums cheminformatics

我的目标是使用元素周期表(或列表)获取有关 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/

相关文章:

java - html解析器使用java搜索和替换一些值

java - eclipse如何运行不同的类

PHP/MySQL Web 应用程序使用枚举数据库字段进行国际化

python - 如何从 SMILES 分子表示生成图形?

java - Spring/freemarker 包含 IDE 和命令行之间的模板不一致

java - 带有 Logback 的 JOOQ

c++ - 允许枚举类的基于范围的 For?

c++ - 如何将 strcat 与 ENUM 一起使用?

python - 选择在图表的 "edge"上绘制线条(并循环),而不是在图表上绘制线条

python - 从微笑文件中检索所有分子