【问题标题】:How to avoid nested for loop for arraylist, java如何避免arraylist,java的嵌套for循环
【发布时间】:2019-06-24 07:40:44
【问题描述】:

我有两个 arraylist ,基于某些相等标准,我将值设置为一个列表, 下面是代码,如何避免嵌套for循环,如何使用map或任何其他方式优化操作,

ArrayList<TriggerTerm> triggerTerms = triggerDaoImpl.getTriggerTerm(.....);
ArrayList<Term> terms = baseDaoImpl.getTerm(.....);

for (TriggerTerm tt : triggerTerms) {
    for (Term t : terms) {
        if (tt.getCodeNumber().equals(t.getCodeNumber()) &&
            tt.getTermNumber().equals(t.getTermNumber())) {
            tt.setStartDate(t.getStartDate());
        }
    }
}

【问题讨论】:

  • 您可以在tt.setStartDate(t.getStartDate()); 之后放置一个break;,除非您特别想设置列表中最后一个匹配Term 的开始日期。
  • TermTriggerTerm 类之间有什么关系?
  • 您似乎正在从数据库中获取这两个列表。您可以使用 JOIN 子句创建 SQL 视图,然后您将只有一个循环。

标签: java dictionary arraylist


【解决方案1】:

我建议如果我们可以在TermTriggerTerm 类之间建立is a 关系(似乎是这样),应该是这样的;

class Terms {

    private String codeNumber;

    private String termNumber;

    private String startDate;

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (!(o instanceof Terms)) return false;

        Terms terms = (Terms) o;
        if (!codeNumber.equals(terms.codeNumber)) return false;
        return termNumber.equals(terms.termNumber);
    }

    @Override
    public int hashCode() {
        int result = codeNumber.hashCode();
        result = 31 * result + termNumber.hashCode();
        return result;
    }
}

class TriggerTerms extends Terms {
    // Inherit setters and getters from the super class as well as `equals` and `hashCode` function.
}

我在代码中省略了 getter 和 setter。另外,请不要使用 equalshashCode 实现。我只使用了codeNumbertermNumber 变量。

如果triggerTermsterms 列表中没有重复值,请使用java.util.HashSet 而不是List。因为下面的例子我使用contains() 函数。在 ArrayList 中,contains() 实现的时间复杂度是 O(n) 以及 indexOf(),但在 HashSet 中,由于它的实现,它是 O(1)。如果你使用

所以,只需使用以下代码 sn-p;

for (TriggerTerms tt : triggerTerms)  {
    if (terms.contains(tt)) {
        tt.setStartDate(terms.get(terms.indexOf(tt)).getStartDate());
    }
}

【讨论】:

    猜你喜欢
    • 2012-06-25
    • 2017-08-27
    • 2017-11-11
    • 1970-01-01
    • 2017-09-20
    • 1970-01-01
    • 2020-05-21
    • 2019-12-26
    • 2015-01-24
    相关资源
    最近更新 更多