【问题标题】:Android ArrayList iteration [closed]Android ArrayList 迭代[关闭]
【发布时间】:2012-10-08 12:46:41
【问题描述】:

我有一个存储区域名称的 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
        }
    }             
}

【问题讨论】:

  • 你能更好地解释你想要实现的目标吗?现在,如果他们不是来自同一地区,您正在做出决定!
  • for (int k = i+1;......会更高效
  • @carnal 我编辑了我的问题..抱歉这个错误。我想知道他们是否来自不同的地区
  • @zetsin: k = i +1 将跳过第一个索引 (0) 并在尝试获取最后一个元素时给他 OutOfBoundException(如果它们具有相同的大小)
  • @Carnal:注意 area_IdList 和 area_IdListduplicate 本质上是同一个 ArrayList。正如他的意思,第一个索引(0)不需要比较。如果它们的大小相同,则不会发生 OutOfBoundException

标签: android arraylist


【解决方案1】:
for (String area : area_IdList) 
{  
    for (String duplicatedArea : area_IdListduplicate)
    {
        if (!area.equalsIgnoreCase(duplicatedArea))
        { 
            // some decision
        }
    }             
}

这样效率更高,速度更快,而不是按索引进行迭代。 因此,这将逐步检查area_IdList 中的每个元素与area_idListduplicate 中的所有元素,并且每次它们不匹配时,都会做出此决定。 (如果这就是你想要实现的)

【讨论】:

  • goes faster instead of iterating by indexes。什么意思?
  • 当您通过索引迭代时 = 它再次从索引 0 重新开始。当您使用我写的内容进行迭代时,它会直接执行而无需重新开始。这就是它的工作方式,但你不会在代码中看到任何内容。
  • @Carnal 不明白你的意思。
  • @您的解决方案不一定是错误的。如果它使用不同的集合或在没有 JIT 的设备上,它可能会更快。更好的方法是降低算法的复杂性。这可以在没有嵌套循环的情况下完成。
【解决方案2】:

这是一个 O(2N) 解决方案,需要 2N 内存而不是 N^2 时间和 N 内存成本。取决于您拥有的项目数量,但此解决方案的成本将大大低于 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
    }
  }

至于不使用索引,见Use Enhanced For Loop Syntax

【讨论】:

  • 就算法复杂度而言,这比选择的答案效率更高。
【解决方案3】:

你可以这样试试

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-23
    • 2014-01-28
    • 2013-03-03
    相关资源
    最近更新 更多