Android ArrayList 迭代

5

我有一个ArrayList存储区域名称。我想检查这个列表,以确定任意人是否来自不同的地区。如果他们来自不同的地区,我会做出决定。我用以下代码实现了这一点。请注意,area_IdList和area_IdListduplicate本质上是相同的ArrayList。这段代码有效吗?还是有人可以建议更有效的代码?谢谢。

public List<String> area_IdList = new ArrayList<String>();
public List<String> area_IdListduplicate = new ArrayList<String>();

for (int i = 0; i < area_IdList.size(); i++) 
{  
    for (int k = 1; k< area_IdListduplicate.size(); k++)
    {
        String sa= area_IdListduplicate.get(k);
        String sb= area_IdList.get(i);
        if (!sa.equalsIgnoreCase(sb))
        { 
            some decision
        }
    }             
}

1
@zetsin:k = i + 1会跳过第一个索引(0),如果它们具有相同的大小,则在尝试获取最后一个元素时会给出OutOfBoundException。 - Carnal
@Carnal:请注意,area_IdList和area_IdListduplicate本质上是相同的ArrayList。就他的意思而言,第一个索引(0)不需要进行比较。如果它们具有相同的大小,则不会发生越界异常。 - zetsin
@zetsin:请再读一遍我的评论。 - Carnal
@Carnal:根据他的意思,第一个索引(0)不需要进行比较。如果它们具有相同的大小,则不会进入第二个for循环,因此不会发生越界异常。 - zetsin
@zetsin:你说得对,关于没有收到“OutOfBoundException”的问题,我考虑了一下list.get(i + 1),读错了。 - Carnal
显示剩余3条评论
3个回答

8
for (String area : area_IdList) 
{  
    for (String duplicatedArea : area_IdListduplicate)
    {
        if (!area.equalsIgnoreCase(duplicatedArea))
        { 
            // some decision
        }
    }             
}

使用这种方法,比通过索引迭代更加高效、更快。因此,在这个过程中,将逐步检查area_IdList中的每个元素与area_idListduplicate中的所有元素,每当它们不匹配时就会做出决策。(如果这正是你想要实现的目标)


以更快的速度前进,而不是按索引迭代。你是什么意思? - iTurki
当您使用索引进行迭代时,它会从索引0重新开始。当您按照我编写的方式进行迭代时,它会直接进行而不重新开始。这就是它的工作原理,尽管在代码中看不到任何东西。 - Carnal
@TJ Thind:https://dev59.com/questions/Imkv5IYBdhLWcg3wlR71#10486601#10486601 - Carnal
@TJ Thind:你是对的。我错了,它并不更快。 - Carnal
1
你的解决方案并不一定是错误的。如果使用不同的集合或在没有JIT的设备上,它可能会更快。更好的方法是减少算法的复杂度。这可以在不使用嵌套循环的情况下完成。 - TJ Thind
显示剩余2条评论

6

这是一种O(2N)的解决方案,相比于N^2时间和N内存成本,它需要2N的内存成本。根据您拥有的项目数量而定,但是这种解决方案的成本显著低于N^2的解决方案。

  Set<String> list=new Set<String>();
  for (String area : area_IdList) 
  {  
    list.add(area.toLowerCase());
  }

  for (String duplicatedArea : area_IdListduplicate)
  {
    if(list.contains(duplicatedArea.toLowerCase())){
      //Do something
    }
  }

关于不使用索引,请参见使用增强型for循环语法


2
就算法复杂度而言,这比所选答案更高效。 - TJ Thind

0

你可以尝试像这样

 for(String areaId : area_IdList){
    if(!area_IdListduplicate.contains(areaId){
    //some decision
    }
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接