Преобразование химической формулы в ее имя iupac

У меня есть периодическая таблица, которую я кодировал в Java, и я работаю над созданием простых соединений (только бинарных соединений) и возвращением информации о них, но у меня возникают проблемы с превращением химической формулы в название IUPAC. Я настроил его так, чтобы человек мог щелкнуть элемент периодической таблицы, а затем щелкнуть другой элемент, а затем всплыло окно, отображающее возможные соединения, которые могут быть созданы из этих двух элементов. Эти соединения будут отображаться в виде химических формул, таких как CO2 или CH4. Я хочу иметь возможность преобразовать химическую формулу соединения, которое кто-то выбрал, в имя iupac, чтобы оно могло отображаться вместе с другой информацией.

Я пытался использовать набор для разработки химии, но, честно говоря, я не очень представляю, как его использовать и даже если он может быть применим для решения моей проблемы. Это заставляет меня вставлять типы облигаций вручную, что кажется гораздо более трудоемким, чем мне стоило бы торговаться.

Например: CO2 будет выделять двуокись углерода, а CH4 - метан.

3 ответа

Решение

Потребуется (действительно) много времени для программирования API, который использует номенклатуру IUPAC. Однако существует способ получить правильное химическое название для химической формулы, которое не требует от вас затрачивания целой жизни на создание API. Это действительно грязный обходной путь, но он работает. Вы можете использовать библиотеку JSoup для поиска химического названия на этом веб-сайте. Он отправляет 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;
}

Однако, как сказал duskwuff, имена IUPAC основаны на структурных свойствах соединения, а не на его формуле. Таким образом, вы можете получить химическое название, но это не обязательно правильное название IUPAC.

Это заставляет меня вставлять типы облигаций вручную, что кажется гораздо более трудоемким, чем мне стоило бы торговаться.

Это неизбежно. Названия ИЮПАК основаны на структурных свойствах соединения, а не на его формуле. Большинство нетривиальных химических формул будет иметь множество возможных структурных изомеров - например, C5 H12 - это формула для н- пентана, метилбутана и 2,2-диметилпропана. Невозможно выбрать одно из этих имен, не зная сначала структуры.

В качестве альтернативы вы можете рассмотреть возможность написания инструмента для преобразования структурной формулы (например, в формате SMILES) в имена IUPAC. Это тоже не тривиальная задача, но по крайней мере выполнимо алгоритмически.

Похоже, вам нужна база данных:

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 = ?
Другие вопросы по тегам