将化学式转换为其 iupac 名称

Converting a chemical formula to its iupac name

我有一个周期性的 table,我在 java 中编码,我正在努力创建简单的化合物(仅二元化合物)并返回有关它们的信息,但我遇到了问题将化学式转化为 IUPAC 名称。我进行了设置,以便一个人可以单击周期性 table 上的一个元素,然后单击另一个元素,然后 window 会弹出,显示可以从这两个元素创建的可能化合物.这些化合物将显示为化学式,例如 CO2 或 CH4。我希望能够将某人选择的化合物的化学式转换为 iupac 名称,以便它可以与其他信息一起显示。

我尝试使用化学开发工具包,但老实说我不太了解如何使用它,即使它可以用于解决我的问题也是如此。它让我手动输入债券类型,这似乎比我应该讨价还价的要多得多。

例如: CO2输出二氧化碳,CH4输出甲烷

听起来您确实需要一个数据库:

create table compound ( 
    first_chemical VARCHAR,
    first_amount INT,
    second_chemical VARCHAR,
    second_amount INT,
    name VARCHAR
)

并像

一样使用它
INSERT INTO compound VALUES('H', 2, 'O', 1, 'Water')

然后你可以这样做

SELECT * FROM compound WHERE first_element = ? AND second_element = ?

It makes me put in the bond types manually, which seems like a ton more work than I should be bargaining for.

这是不可避免的。 IUPAC 名称基于化合物的结构特性,而不是其分子式。大多数重要的化学式都有许多可能的结构异构体——例如,C5H12n[ 的公式=21=]-戊烷、甲基丁烷和2,2-二甲基丙烷。如果不先了解结构,就无法选择其中一个名称。

作为替代方案,您可能需要考虑编写一个工具,用于将结构式(例如,SMILES 格式)转换为 IUPAC 名称。这也不是一项微不足道的任务,但至少在算法上是可行的。

编写一个使用 IUPAC 命名法的 API 需要(真的)很长时间。然而,有一种方法可以获得化学式的正确化学名称,不需要您花费一生来创建 API。这是一个非常肮脏的解决方法,但它确实有效。你可以使用JSoup library to perform a chemical name search through this website。它发送 HTTP post 请求,解析结果,并 returns 包含搜索结果的字符串数组。它真的很混乱,而且可能被大多数程序员认为是有罪的,但它确实有效。

public static String[] searchIUPACName(String chemicalFormula) throws IOException {
    org.jsoup.nodes.Document doc = org.jsoup.Jsoup.connect("http://www.endmemo.com/chem/chemsearch.php")
            .data("Search", "Search").data("name", chemicalFormula).data("sel", "f").post();
    org.jsoup.select.Elements elements = doc.getElementById("note").getElementsByClass("cmline");
    if (elements.isEmpty())
        return new String[] { "No results" };
    String[] names = new String[elements.size() - 1];
    for (int i = 1; i < elements.size(); i++) {
        names[i - 1] = elements.get(i).getElementsByClass("cmname").get(0).getElementsByTag("a").get(0).text();
    }
    return names;
}

然而,正如 duskwuff 所说,IUPAC 名称是基于化合物的结构特性,而不是其分子式。所以你可以获得一个化学名称,但它不一定是正确的 IUPAC 名称。