在ArrayList中的LinkedHashMap中查找和分配值的替代方法

时间:2012-07-07 14:40:08

标签: java arraylist linkedhashmap

我有一个显示在下面的代码,它的工作正常。但我想知道是否有其他方法可以实现这一点?基本上我正在使用4个循环来比较和分配一个新值到Key of CopyMatrix,如果使用SeqGenerate中的String / Element找到匹配,则它是一个arraylist中的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 Ea arrt th}

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

所以我唯一知道如何比较嵌套循环中的元素是为了生成循环,例如我要将seqGenerate元素0元素1与存储在复制矩阵中的键进行比较。如果我发现匹配将替换该值。希望这很清楚。

谢谢你的时间!

2 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分: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);
  }
}

Map的重点是避免线性时间遍历。这应该只是

Double temp = entries.get(getString);
if (temp != null) {
  if (temp.doubleValue() == 0) {
    temp = 0.00000001;
  }
  tempVal.put(getString, Math.abs(Math.log10(temp));
}