java - 比较 2 个列表中的元素时如何避免 O(N^2)?

标签 java algorithm list

我有 2 个具有相同对象类型的列表。

List A [ foo, bar, moo, woo, pee ]

List B [ bar, woo ]

我想比较这两个列表,如果名称匹配, 将其属性设置为 true。

例如,

if(ListA[1].name.equals(ListB[0].name)) { //match name 'bar' and 'bar'
    ListA[1].hasSameName = true;
}

类似的东西。

我可以写 O(N^2) 的解决方案。

for(Talent checkedTalent : ListA) {
    for(Talent filteredTalent : ListB) {
        if( checkedTalent.Id.equals(filteredTalent.Id) ) {
            filteredTalent.isSelected = true;   
        }
    }
}

可以用更有效的方式做到这一点吗?

最佳答案

对 O(n) 解决方案使用散列(假设有效的散列实现):

Set<String> ids = new HashSet<String>(ListA.size());
for(Talent checkedTalent : ListA) {
    ids.add(checkedTalent.Id);
}
for(Talent filteredTalent : ListB) {
    if (ids.contains(filteredTalent.Id)) {
        filteredTalent.isSelected = true;
    }
}

关于java - 比较 2 个列表中的元素时如何避免 O(N^2)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5725370/

相关文章:

java - 如何在eclipse中编写正则表达式而不出现编译时错误

algorithm - STM32L1xx 上的闪存 ECC 算法

algorithm - Till what number 在 5 秒内找到给定数字的除数

python - Python 中的字符串列表乘法

java - 从 DTO 类获取 REST xml

java - 减少 Vaadin Charts 2 中图表内的空白

java - ClassNotFoundException:config_inputEventCompatProcessorOverrideClassName androidx,在 andoridx 上运行崩溃

c++ - 带最低频率字符的字符串查找算法

c# - 如何用简单的方法在Unity中包装这些重复的代码行?

python - 用多个字典值替换字符串中的单词?