代码之家  ›  专栏  ›  技术社区  ›  tcooc

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

  •  0
  • tcooc  · 技术社区  · 12 年前

    我目前有一个 NElement 对象。每个 N元素 对象具有唯一 Element 字段和整数n。

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

    1. 遍历集合中的所有值。
    2. 具有 Element e ,在集合中搜索的实例 N元素 已经 e 并对其进行处理。

    下面是#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);
    }
    

    我认为有一种更好的方法可以使用列表或集合以外的集合来实现这一点。有什么建议吗?

    2 回复  |  直到 12 年前
        1
  •  2
  •   Jordan Kaye    12 年前

    一个可能的解决方案是采用不同的设计。分子式由一堆元素以及这些元素的数量组成。因此,一个可能的解决方案是 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);
            }
        }
    }
    

    这是匆忙拼凑在一起的,根本不是很有效,但它应该会给你一个可能的选择的想法。

        2
  •  1
  •   dbn    11 年前

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

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