什么是储存化学配方的最有效方法?

时间:2012-10-01 19:44:21

标签: list collections hashset

我目前有一个NElement个对象的HashSet。每个NElement对象都有一个唯一的Element字段和一个整数n。

以下是我需要对数据进行的两项操作:

  1. 迭代集合中的所有值。
  2. 使用Element e,在集合中搜索具有NElement的{​​{1}}实例并对其进行处理。
  3. 以下是#2的例子:

    e

    我认为有一种更好的方法可以使用List或Set之外的集合来实现此目的。有什么建议吗?

2 个答案:

答案 0 :(得分:2)

可能的解决方案将是一个不同的设计。分子式由一系列元素以及有多少元素组成。因此,一个可能的解决方案是拥有一个包含此信息的MolecularFormula类,该类基于 Map<Element, int>

一个可能的例子:

public class MolecularFormula
{
    private Map<Element, int> elements = new HashMap<Element, int>();

    //... Constructors etc
    //A list to iterate through all values
    public List<NElement> getElements()
    {
        List<NElement> retList = new ArrayList<NElement>();
        foreach(Element e : elements)
        {
            retList.put(new NElement(e, elements.get(e));
        }
        return retList;
    }

    //To add something
    public void add(Element e, int num)
    {
        if(elements.containsKey(e))
        {
            int newNum = elements.get(e) + num;
            elements.remove(e);
            elements.put(e, newNum);
        }
        else
        {
            elements.put(e, num);
        }
    }
}

这是匆匆放在一起,根本不是很有效,但它应该让你知道一个可能的选择。

答案 1 :(得分:1)

尝试使用SMARTSSMILESInChiASL。我相信前两个是开源的。 InChi由IUPAC维护,可以很好地用于数据库使用。 ASL是Schrödinger, Inc的专有,但如果您已经在使用Schrödinger软件,我建议您直接使用他们的Python API。

使用这些工具中的任何一种,您都可以找到由SMARTS / SMILES / ASL描述的分子内的特定SMARTS / SMILES / ASL字符串描述的功能组(或原子)。