0

現在、オブジェクトの HashSet がありNElementます。各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);
}

リストまたはセット以外のコレクションを使用してこれを達成するためのより良い方法があると思います。助言がありますか?

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

SMARTSSMILESInChiまたはASLを使用してみてください。最初の 2 つはオープン ソースだと思います。InChi は IUPAC によって管理されており、データベースで使用するために適切にハッシュ可能です。ASL はSchrödinger, Incの所有物ですが、既に Schrödinger ソフトウェアを使用している場合は、その Python API を直接使用することをお勧めします。

これらのツールのいずれかを使用して、SMARTS/SMILES/ASL で記述された分子内の特定の SMARTS/SMILES/ASL 文字列で記述された官能基 (または原子) を見つけることができます。

于 2012-10-01T20:11:17.783 に答える