我有一个显示在下面的代码,它的工作正常。但我想知道是否有其他方法可以实现这一点?基本上我正在使用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与存储在复制矩阵中的键进行比较。如果我发现匹配将替换该值。希望这很清楚。
谢谢你的时间!
答案 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));
}