0

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

以下是我需要对数据执行的 2 项操作:

  1. 遍历集合中的所有值。
  2. 使用Element e,在集合中搜索具有的实例NElemente对其进行处理。

这是#2的示例:

public void Add(NElement ne) {
    foreach(NElement ne2 in elements) { //elements is the HashSet
        if(ne2.element == ne.element) {
            ne2.Number += ne.Number; //Number is the integer
            return;
        }
    }
    elements.Add(ne);
}

我认为有一种更好的方法可以使用 List 或 Set 以外的集合来完成此任务。有什么建议么?

4

2 回答 2

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

这是匆忙拼凑起来的,根本不是很有效,但它应该让您对可能的选择有所了解。

于 2012-10-01T20:37:57.007 回答
1

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

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

于 2012-10-01T20:11:17.783 回答