将化学式转换为其iupac名称

时间:2019-01-01 01:35:17

标签: java chemistry

我有一个周期表,我用Java编写了代码,正在研究创建简单的化合物(仅二进制化合物)并返回有关它们的信息,但是在将化学式转换为IUPAC名称时遇到了麻烦。我进行了设置,以便一个人可以单击元素周期表上的一个元素,然后单击另一个元素,然后将弹出一个窗口,显示可能由这两个元素创建的化合物。这些化合物将显示为化学式,例如CO2或CH4。我希望能够将某人选择的化合物的化学式转换为iupac名称,以便可以与其他信息一起显示。

我尝试使用化学开发套件,但是老实说,我对如何使用它没有太多的想法,即使它可以解决我的问题。这使我手动输入了债券类型,这似乎比我应该讨价还价要多得多。

例如: CO2将产生二氧化碳,而CH4将产生甲烷。

3 个答案:

答案 0 :(得分:3)

  

这使我手动输入了债券类型,这似乎比我应该讨价还价要多得多。

这是不可避免的。 IUPAC名称基于化合物的结构特性,而不是其分子式。大多数非平凡的化学式都会有许多可能的结构异构体,例如C 5 H 12 n -戊烷,甲基丁烷,和2,2-二甲基丙烷。在不首先了解结构的情况下,无法选择其中一个名称。

作为一种替代方法,您可能需要考虑编写一种用于将结构式(例如,SMILES格式)转换为IUPAC名称的工具。这也不是一件容易的事,但是至少在算法上可行。

答案 1 :(得分:0)

听起来确实需要数据库:

func(w http.ResponseWriter, r *http.Request)
    var data = [][]string{{"Line1", "Hello"}, {"Line2", "World"}}
    buffer := &bytes.Buffer{} // creates IO Writer

    writer := csv.NewWriter(buffer)

    for _, value := range data {
        err := writer.Write(value)
        checkError("Cannot write to buffer", err)
    }

    writer.Flush()

    w.Header().Set("Content-Type", "text/csv") // setting the content type header to text/csv
    w.Header().Set("Content-Disposition", "attachment;filename=TheCSVFileName.csv")
    w.Write(buffer.Bytes())
}

并像使用它

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')

答案 2 :(得分:0)

对使用IUPAC命名法的API进行编程(真的)将花费很长时间。但是,有一种方法可以为化学式获取正确的化学名称,而无需花费毕生的时间来创建API。这是一个非常肮脏的解决方法,但它确实起作用。您可以使用JSoup库通过this website进行化学名称搜索。它发送HTTP发布请求,解析结果,并返回包含搜索结果的字符串数组。这确实很麻烦,可能对大多数程序员来说都是有罪的,但它确实有效。

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;
}

但是,就像黄昏药说的那样,IUPAC名称是基于化合物的结构特性,而不是其分子式。因此您可以获得化学名称,但这不一定是正确的IUPAC名称。