0

以下にコードが表示されていますが、正常に機能しています。しかし、これを実装する他の方法があるかどうか疑問に思いましたか?基本的に、私が4つのループで行っているのは、SeqGenerateのString / Elementを使用して一致が見つかった場合に、配列リスト内のリンクされたハッシュマップであるCopyMatrixのキーに新しい値を比較して割り当てることです。私はループでもある別の解決策を持っていましたが、それは機能していなかったので、これで立ち往生していて、より少ないループまたはおそらく他のいくつかの技術でこれを行う他の方法があるかどうか疑問に思っています。

ArrayList<ArrayList<String>> SeqGenerate = new ArrayList<ArrayList<String>>();
ArrayList<LinkedHashMap<String, Double>> copyOfMatrix = new ArrayList<LinkedHashMap<String, DOuble>>();
ArrayList<LinkedHashMap<String, Double>> calcLogProb = new ArrayList<LinkedHashMap<String, DOuble>>();


for (ArrayList<String> getArray: SeqGenerate){
            LinkedHashMap<String, Double> tempVal = new LinkedHashMap<String, Double>();
            for (String getString: getArray){
                for (LinkedHashMap<String, Double> entries: copyOfMatrix){

                    Iterator <String> iterKey = entries.keySet().iterator();
                    Iterator <Double> iterVal = entries.values().iterator();
                        while (iterKey.hasNext()){
                            String keyVal = iterKey.next();
                            Double Value = iterVal.next();

                            if (getString.equals(keyVal)){
                                Double temp = Value;
                                if (temp==0){
                                        temp=0.00000001;
                                    }

                                Double seqVal = Math.abs(Math.log10(temp));                         
                                tempVal.put(keyVal, seqVal);
                            }

                        }   
                }
            }
            calcLogProb.add(tempVal);
        }

編集

SeqGenerateにはこの要素が含まれています
ArrayList--------String
(1)Hello World = {He el ll lo o_ _W Wo or rl ld}

(2)Hello Earth = {He el ll lo o_ _E Ea ar rt th}

HelloWorldとHelloEarthは、SeqGenerateに含まれるテキストの種類の例ですが、私が説明したように、これらは2文字のシーケンスとして格納されます。copyOfMatrixには同じ種類のシーケンスが含まれていますが、別の文とテキストのセットから生成しましたが、一致するものが見つかった場合に値を比較して置き換える2文字のシーケンスです。

したがって、ネストされたループ内の要素を比較する方法を知っているのは、forループを作成することだけです。たとえば、seqGenerate要素0の要素1を、コピー行列に格納されているキーと比較します。一致するものが見つかった場合は、値を置き換えます。これが十分に明確であることを願っています。

御時間ありがとうございます!

4

2 に答える 2

3

なんでやってるのかさっぱりわからん

Iterator <String> iterKey = entries.keySet().iterator();
Iterator <Double> iterVal = entries.values().iterator();
while (iterKey.hasNext()){
  String keyVal = iterKey.next();
  Double Value = iterVal.next();

  if (getString.equals(keyVal)){
    Double temp = Value;
    if (temp==0){
      temp=0.00000001;
    }

    Double seqVal = Math.abs(Math.log10(temp));                         
    tempVal.put(keyVal, seqVal);
  }
}

a の要点は、Map線形時間のトラバーサルを回避することです。これはただのはずです

Double temp = entries.get(getString);
if (temp != null) {
  if (temp.doubleValue() == 0) {
    temp = 0.00000001;
  }
  tempVal.put(getString, Math.abs(Math.log10(temp));
}
于 2012-07-07T15:22:17.997 に答える
3

コードを書き直すつもりはありませんが、複雑に構成されたコレクションや入れ子になったループを見ると、少し吐き気がすることをお伝えします。ここにアイデアがあります: これらのコレクションはすべて拡張できます。つまり、各レベルで検索メソッドを含むカスタム クラスを作成できます。

私が他に唯一お勧めできるのは、複雑なデータ配置を処理する優れた機能を備えた、Groovy などのラムダを使用する言語を試すことです。

さて、もう 1 つアイデアがありました。SQL を使用してこの問題を解決しようとした方がよいでしょうか?

于 2012-07-07T14:48:14.217 に答える