0

我在下面显示了一个代码,它工作正常。但我想知道是否还有其他方法可以实现这一点?基本上,我对 4 个循环所做的是比较并为 CopyMatrix 的键分配一个新值,如果使用 SeqGenerate 中的字符串/元素找到匹配项,则该键是数组列表中的一个linkedhashmap。我有另一个解决方案,它也是一个循环,但它没有工作,所以我坚持这个,我想知道是否有其他方法可以用更少的循环或其他一些技术来做到这一点。

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 Ear rt th}

Hello World 和 Hello Earth 是 SeqGenerate 中包含的文本类型的一个示例,但它们存储为两个字符序列,如我所示。copyOfMatrix 包含相同类型的序列,但我从另一组句子和文本生成它,但它们始终是两个字符的序列,如果找到匹配项,它们将比较并替换该值。

因此,我唯一知道如何比较嵌套循环中的元素是制作 for 循环,例如,我将 seqGenerate element 0 element 1 与存储在复制矩阵中的键进行比较。如果我找到匹配项,我将替换该值。希望这足够清楚。

谢谢你的时间!

4

2 回答 2

3

好吧,我不会为你重新编写你的代码,但我会告诉你,当我看到大量组合的集合和嵌套循环时,我会有点呕吐。这是给您的一个想法:所有这些集合都可以扩展,这意味着您可以创建自定义类,其中包括每个级别的查找方法。

我唯一的另一个好的建议是尝试使用带有 lambda 的语言,例如 Groovy,它具有更好的处理复杂数据排列的能力。

好的,我对您还有一个想法:尝试使用 SQL 解决这个问题会更好吗?

于 2012-07-07T14:48:14.217 回答
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 回答