46条for_each循环优于传统for循环

Jdk1.5之前,变量集合做法如下:

请去翻Effect Java原书。

比如:

public staticvoid main(String[] args) {

                   ArrayListarray = new ArrayList();

                   array.add("a");

                   array.add("b");

                   for(Iteratori = array.iterator(); i.hasNext(); ){

                            System.out.println(i.next());

                   }

         }

遍历数组就是我们常用的如下:

请去翻Effect Java原书。

 

这两种做法比while要好,避免了复制粘贴的错误,但是还不够完美,迭代器和索引变量会造成一些混乱。如果出现超过三次就很容易出错。

Jdk1.5之后,音符for-each循环,适用于集合和数组

性能上没有损失,推荐我们使用,肯定是有原因的:

文中举了两个例子:请去翻Effect Java原书。

(1)      嵌套遍历两个结合,产生m*n的结果的时候,我们会很容易使用如下:

Dosomething(i.netx(),j.next());

这样就会有bug,我们应该定义一个变量 temp=i.next();在遍历另一个

(2)      打印两个筛子的36种情况,也会出现类似的问题

这就是为什么要使用for-each,一个呢是,代码优雅,更重要的是可以直接避免我们自以为是的错误。

最后,文中说,如果我们自己编写的类型表示一组元素,即使不实现Collection也要实现Iterable接口。

一般的类是差不多这个样子:

class Model implementsIterable<String>{

         ArrayList<String>list = new ArrayList<String>();

         public  void add(String str) {

                   list.add(str);

         }

         @Override

         publicIterator<String> iterator() {

                   returnlist.iterator();

         }

        

}

然后这么用:

Model model = new Model();

                   model.add("c");

                   model.add("d");

                   for(Strings:model){

                            System.out.println(s);

                   }

不如实际使用ArrayList了,可能是Model类中如果还有其他的东西,比如一个班级,有自己的班级号classNum,学生数studentNum,然后才是studentList。这个问题值得研究,应该是有别的原因的。

http://huxiao.iteye.com/blog/867752。该博客这么写参考了ArrayList的源码的写法,自己看看,大家可以讨论学习。

 

那么问题来了,IterableIterator的区别

Java api文档这么说的:在java.util包中

public interface Iterator<E>

An iterator over a collection. Iterator takesthe place of Enumeration inthe Java Collections Framework. Iterators differ from enumerations in two ways:

  • Iterators allow the caller to remove elements from the underlying collection during the iteration with well-defined semantics.
  • Method names have been improved.

This interface is a member of the Java Collections Framework.

 

Iterator遍历一个集合,在java集合框架中取代了枚举,和枚举有两点不同:

     允许调用者删除元素,不理解具体的使用情形

     方法名称得到改善,不理解。这个应该是和枚举的方法名称比,更合理,容易理解

它是java集合框架的一个成员java集合框架还是需要学习,阅读其官方文档。(进入ArrayList等,找到This class is a member of the Java CollectionsFramework.点击有时间看吧)。

 

Iterable 在java.lang包中,就一句话说明,也只有一个方法

public interface Iterable<T>

Implementing this interface allows anobject to be the target of the "foreach" statement.

 

 

一个总结的比较好的;原文:http://blog.csdn.net/ningguixin/article/details/8079242

Iterator是迭代器类,而Iterable是接口。 
好多类都实现了Iterable接口,这样对象就可以调用iterator()方法。 
一般都是结合着用,比如 
HashMap类就实现了Iterable接口,而要访问或打印出Map中所有内容时,就可以这样: HashMap hashMap; 
Iterator iter = hashMap.iterator(); 
while(iter.hashNext()) { 
  String s = iter.next(); 



为什么一定要实现Iterable接口,为什么不直接实现Iterator接口呢? 
      看一下JDK中的集合类,比如List一族或者Set一族,都是实现了Iterable接口,但并不直接实现Iterator接口。 
仔细想一下这么做是有道理的。 

      因为Iterator接口的核心方法next()或者hasNext() 是依赖于迭代器的当前迭代位置的。 
      如果Collection直接实现Iterator接口,势必导致集合对象中包含当前迭代位置的数据(指针)。 
      当集合在不同方法间被传递时,由于当前迭代位置不可预置,那么next()方法的结果会变成不可预知。 
      除非再为Iterator接口添加一个reset()方法,用来重置当前迭代位置。 
      但即时这样,Collection也只能同时存在一个当前迭代位置。 
      Iterable则不然,每次调用都会返回一个从头开始计数的迭代器。 
      多个迭代器是互不干扰的。 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
GeoPandas是一个开源的Python库,旨在简化地理空间数据的处理和分析。它结合了Pandas和Shapely的能力,为Python用户提供了一个强大而灵活的工具来处理地理空间数据。以下是关于GeoPandas的详细介绍: 一、GeoPandas的基本概念 1. 定义 GeoPandas是建立在Pandas和Shapely之上的一个Python库,用于处理和分析地理空间数据。 它扩展了Pandas的DataFrame和Series数据结构,允许在其中存储和操作地理空间几何图形。 2. 核心数据结构 GeoDataFrame:GeoPandas的核心数据结构,是Pandas DataFrame的扩展。它包含一个或多个列,其中至少一列是几何列(geometry column),用于存储地理空间几何图形(如点、线、多边形等)。 GeoSeries:GeoPandas中的另一个重要数据结构,类似于Pandas的Series,但用于存储几何图形序列。 二、GeoPandas的功能特性 1. 读取和写入多种地理空间数据格式 GeoPandas支持读取和写入多种常见的地理空间数据格式,包括Shapefile、GeoJSON、PostGIS、KML等。这使得用户可以轻松地从各种数据源中加载地理空间数据,并将处理后的数据保存为所需的格式。 2. 地理空间几何图形的创建、编辑和分析 GeoPandas允许用户创建、编辑和分析地理空间几何图形,包括点、线、多边形等。它提供了丰富的空间操作函数,如缓冲区分析、交集、并集、差集等,使得用户可以方便地进行地理空间数据分析。 3. 数据可视化 GeoPandas内置了数据可视化功能,可以绘制地理空间数据的地图。用户可以使用matplotlib等库来进一步定制地图的样式和布局。 4. 空间连接和空间索引 GeoPandas支持空间连接操作,可以将两个GeoDataFrame按照空间关系(如相交、包含等)进行连接。此外,它还支持空间索引,可以提高地理空间数据查询的效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值