2012-10-01 101 views
0

我目前有一個HashSet的NElement對象。每個NElement對象都有一個唯一的Element字段和一個整數n。什麼是儲存化學配方的最有效方法?

這裏有兩個操作,我需要的數據來做:

  1. 遍歷集合中的所有值。
  2. Element e,搜索該集合的NElement的實例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); 
} 

我認爲這是一個更好的方式來做到這一點比使用列表或設置其他的集合。有什麼建議麼?

+0

您將使用的元素數量有限嗎?或者你需要支持完整的週期表嗎? – JayDM

+0

有沒有你沒有使用地圖的原因? –

+0

@JayDM我代表一個分子式,所以它是最小的沒有和最大的可能的最大分子。我不添加公式中不存在的元素。 – tcooc

回答

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

這是匆忙拼湊而成,而不是非常有效率可言,但它應該給你一個可能的選擇的一個想法。

+0

感謝您的示例。我知道Map或類似的東西會更好,但不知道正確的鍵值組合。這澄清了很多。 – tcooc

+0

在思考地圖時,總是試着想想你擁有哪些獨特的東西 - 獨特的類型永遠是你的鑰匙! –

1

嘗試使用SMARTS,SMILES,InChiASL。我相信前兩個是開源的。 InChi由IUPAC維護,並且對於數據庫使用來說很好。 ASL專有於Schrödinger, Inc,但如果您已經使用Schrödinger軟件,我建議直接使用他們的Python API。

使用這些工具中的任何一種,可以找到由SMARTS/SMILES/ASL描述的分子內特定SMARTS/SMILES/ASL字符串描述的功能組(或原子)。

+0

是的,我正在使用SMILES的一些功能。但是,我正在解析基本的化學公式。另外,我需要一種方法來代表記憶中的分子,而不是一個字符串。 – tcooc

+0

我想我的答案是針對一個更一般的問題,其中包括結構,而不僅僅是公式。約旦Kaye的答案確實對這個問題更有意義。 – dbn

相關問題