解析一个包含多个地址的数组时循环顺序异常。

ios开发新手,求教。。

尝试使用CLGeocoder解析一个addressArray并依次添加到一个MapItemArray中,代码如下:

[self getAddress];
int m=0;
while (m<self.addressArray.count){
    NSString *address=self.addressArray[m];
    NSLog(@"需要解析的地址为%@",address);
    CLGeocoder *geocoder=[[CLGeocoder alloc]init];
    [geocoder geocodeAddressString:address completionHandler:^(NSArray<CLPlacemark *> * _Nullable placemarks, NSError * _Nullable error) {
        if(error||placemarks.count==0){
            NSLog(@"解析失败");
        }else{
            CLPlacemark *place=[placemarks lastObject];
            MKPlacemark *mp=[[MKPlacemark alloc]initWithPlacemark:place];
            MKMapItem *mapItem=[[MKMapItem alloc]initWithPlacemark:mp];
            [self.mkItemArray addObject:mapItem];
            NSLog(@"有%lu个Item被添加",(unsigned long)self.mkItemArray.count);
        }
    }];
    m+=1;
}
NSLog(@"一共有%lu个Item",(unsigned long)self.mkItemArray.count);

假设地址数组中只有一个地址“上海”,我预想的输出顺序应该是:
1.“需要解析的地址为上海”
2.有1个Item被添加
3.一共有1个item

但实际是:
1.需要解析的地址为上海
2.一共有0个Item
3.有1个Item被添加

这是为什么?

1个回答

/**

  • 有一个数组a[N],要求每隔两个数删掉一个数,到末尾则又循环到开头继续进行
  • 求最后一个被删掉的数的原始下标位置
  • 例如,一个数组:{0, 1, 2, 3, 4, 5, 6, 7}
  • 0->1->2(第一遍,删除)->3->4->5(第一遍,删除)->6->7->
  • 0(第二遍,删除)->1->2(已删除)->3->4(第二遍,删除)->5(已删除)->6->7...
  • 循环直到数组中最后一个元素被删除

  • 当然,这里并未真正删除元素,只是用标志位表示已经被删除
  • @author Wll
  • */

    public class DeleteEveryTwo {

    public static void main(String[] args) {

    int index = getLastDeletedIndex(8);

    System.out.println("The last index deleted is " + index);

    }

    /**

    • @param a
    • 数组长度
    • @return 最后被删除的数的原始下标
      */

      public static int getLastDeletedIndex(int len) {

      if (len <= 0) { // 如果数组长度不满足要求则返回 -1

      return -1;

      }

      int[] arr = new int[len];

      for (int i = 0; i < len; i++) { // 初始化每个元素的值为当前下标

      arr[i] = len;

      }

      final int DELFLAG = len + 1; // 删除标志位

      int currentSize = len; // 记录数组当前有效长度(即未被置为删除标志的元素个数),最后变为 0

      final int STEP = 2; // 步长

      int count = 0; // 步长计数

      int lastDelIndex = 0; // 记录最后被删除的元素的下标

      int i = 0; // 循环下标

      while (currentSize != 0) {

      if (arr[i] != DELFLAG) { // 判读当前元素是否等于删除标志

      if (count++ == STEP) { // 当步长计数满足步长则

      arr[i] = DELFLAG; // 将元素置为删除标志位

      lastDelIndex = i; // 记录该处下标

      currentSize--; // 有效数组长度减 1

      count = 0; // 步长计数归零

      System.out.println("Deleted index is " + i % len);

      }

      }

      i = (i + 1) % len; // 下标取余实现循环下标

      }

      return lastDelIndex;

      }

      }

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!