A. JAVA iterator 迭代器模式的next() 的問題 求高手回答 謝謝! 真誠求學 在線等。
關於你的疑問,請參考我的學習筆記吧。
hasNext、next方法:迭代器用於遍歷集合元素。獲取迭代器可以使用Collection定義的方法:Iterator iterator()
迭代器Iterator 本身是一個介面,集合在重寫Collection的iterator()方法時利用內部類提供了迭代器的實現。Iterator提供了統一的遍歷集合元素的方式,其提供了用於遍歷集合的兩個方法:boolean hasNext()判斷集合是否還有元素可以遍歷。
E next() 返回迭代的下一個元素。
每一種集合的實現類都是各自的迭代器實現,不用關心具體迭代器的類型,只將他們當作迭代器用於遍歷集合元素即可。應當遵循「問-取-刪」模式,適用於while循環。
Iterator<String>it = c1.iterator(); --- 問的過程,詢問c1集合中是否還有元素
while( it.hasNext() )
{
String str = (String) it.next(); --- 取出來的是Object類型,所以需要轉換類型
}
注意:應建立在hasNext返回true的基礎上執行next()方法
迭代過程中,不能調用集合的相關方法來改變集合中的元素,不然會拋出異常。應使用迭代器自身提供的方法操作。迭代器的刪除方法是在原集合中刪除元素。在調用remove方法前必須通過迭代器的next()方法迭代過元素,那麼刪除的就是這個元素,並且不能連續接著調用remove。
While( it.hasNext() )
{
String str = (String) it.next();
if(「#」.equals ( str ) )
{ //凡是相互比較,應當讓字變數.equals(變數),可以避免遇到null空指針異常
it.remove();
}
}
B. python3自定義迭代器對象如何用next方法依次迭代
Python 3.x與Python 2.x之間存在著較多的語法細節差異。今天在看Python核心編程的時候,說到了自定義迭代器對象。於是動手將源碼打了一遍,原書代碼如下:
class AnyIter(object):
def __init__(self, data, safe=False):
""" The initialization of iterators """
self.safe = safe
self.iter = iter(data)
def __iter__(self):
""" return a iterator """
return self
def next(self, count=1):
""" Return arbitrary numbers of elements """
retval = []
for item in range(count):
try:
retval.append(self.iter.next())
except StopIteration:
if self.safe:
break
else:
raise # reraise the exception again
return retval
if __name__ == '__main__':
a = AnyIter(range(10), True)
b = iter(a)
for item in range(1,5):
print('{}:{}'.format(item, a.next(item)))
我機器上裝的是Python 3.3.2,在控制台運行該腳本的時候直接拋出異常TypeError:
說是iter()返回的是一個非迭代器類型的對象。前後對照了一下,並沒有發現哪裡有錯誤啊。於是嘗試使用Ipython(Python 版本是2.7.5)來運行該代碼,得出完美結果。於是考慮是不是版本的問題。求助google,在stackoverflow上找到一個帖子,找到了關鍵原因:
於是將上述代碼中調用next()的地方全部替換為__next__(),最後在控制台運行該代碼,正確得到了預期的結果:
查閱Python 3.3.2 附帶的用戶手冊,果然得到如下結果:
問題得到解決:Python核心編程使用的是Python 2.x,版本差異使得該狀況得以發生。還是得動手,不然這樣的差異無法得知。
C. Iterator和Iterator<E>什麼區別
Iterator是迭代器類,而Iterable是介面。
好多類都實現了Iterable介面,這樣對象就可以調用iterator()方法。
一般都是結合著用,比如
HashMap類就實現了Iterable介面,而要訪問或列印出Map中所有內容時,就可以這樣: HashMap hashMap;
Iterator iter = hashMap.iterator();
while(iter.hashNext()) {
String s = iter.next();
}
轉至:http://liuyun025.iteye.com/blog/1321045
為什麼一定要實現Iterable介面,為什麼不直接實現Iterator介面呢?
看一下JDK中的集合類,比如List一族或者Set一族,都是實現了Iterable介面,但並不直接實現Iterator介面。
仔細想一下這么做是有道理的。
因為Iterator介面的核心方法next()或者hasNext() 是依賴於迭代器的當前迭代位置的。
如果Collection直接實現Iterator介面,勢必導致集合對象中包含當前迭代位置的數據(指針)。
當集合在不同方法間被傳遞時,由於當前迭代位置不可預置,那麼next()方法的結果會變成不可預知。
除非再為Iterator介面添加一個reset()方法,用來重置當前迭代位置。
但即時這樣,Collection也只能同時存在一個當前迭代位置。
而Iterable則不然,每次調用都會返回一個從頭開始計數的迭代器。
多個迭代器是互不幹擾的。
D. 如何定義next函數
不知你問的next()函數指的是KMP演算法中的那個嗎?如果是,請看下面的內容吧。
void get_next(char T int next[])//求串T的next值,並存儲在next數組中
{
i=1,j=0,next[1]=0;//i和j指向的都是T上的字元位置('abcdea'對應的是'123456')
while(i<T[0])//循環條件,當i<串T中元素個數
{
if(j==0llT[i]==T[j]){++i;++j;next[i]=j}
else j=next[j]
}
}
E. 安卓自定義方法問題。
如果你在布局文件中定義了onclick屬性就必須在activity中實現它,public void onclick屬性值(View v){方法體}是一個固定格式 , 他的參數view指的是添加這個屬性的控制項 , 這里指的你的textswitcher,
F. Jquery中next和children的區別
1、.next()方法定義和用法
next()獲得匹配元素集合中每個元素緊鄰的同胞元素。如果提供選擇器,則取回匹配該選擇器的下一個同胞元素。
2、.children()方法定義和用法
children()方法返回匹配元素集合中每個元素的子元素,添加可選參數可通過選擇器進行過濾。
3、根據定義可以總結出:next是選擇兄弟元素,children是選擇子元素。
實例:
<divid="div1">
<divid="children"></div>
</div>
<divid="div1Next"></div>
<scripttype="text/javascript">
$("#div1").children();//拿到的是div1的子元素(id為children的元素)
$("#div1").next();//拿到的是id為div1Next的兄弟元素,等同於$("#div1Next")
</script>
G. java中next()方法是干什麼的
next() 不換行
nextLine() 切換到下一行 in.nextLine();返回的是一個長度為0的空字元串:
可以在input = in.nextLine(); 後加
System.out.prinln("前"+input+"後,字元長度="+input.length());
你就能看到
next()要得到有效標記才能返回值,而nextLine()則不管這個,只要有當前行就能返回,當前行的剩餘字元是0個照樣返回。
修改方法有兩種:
1、在每次in.nextDouble();後加一句in.nextLine();就不會出現這個問題了。
因為nextDouble沒有義務處理換行,要用nextLine來處理換行,這樣後面的input = in.nextLine(); 時沒有新行,就會等待輸入。
2、把while判斷改為while(!input.equals("Y"));或者while (input.equals("N")&&(input.length()!=0));
H. java 中Scanner 從控制台輸入數據時hasnext() ,方法與next()方法的區別為什麼都會要要求輸入數據
你好,hasNext()方法的定義如下:
public boolean hasNext()如果此掃描器的輸入中有另一個標記,則返回 true。在等待要掃描的輸入時,此方法可能阻塞。掃描器將不執行任何輸入。
返回:
當且僅當此掃描器有另一個標記時才返回 true
next()方法的定義:
public String next()查找並返回來自此掃描器的下一個完整標記。完整標記的前後是與分隔模式匹配的輸入信息。即使以前調用 hasNext() 返回了 true,在等待要掃描的輸入時此方法也可能阻塞。
相信你看完上面的解釋,就應該明白是怎麼回事了。
I. python 迭代器和生成器的區別
Num01–>迭代器
定義:
對於list、string、tuple、dict等這些容器對象,使用for循環遍歷是很方便的。在後台for語句對容器對象調用iter()函數。iter()是python內置函數。
iter()函數會返回一個定義了next()方法的迭代器對象,它在容器中逐個訪問容器內的元素。next()也是python內置函數。在沒有後續元素時,next()會拋出一個StopIteration異常,通知for語句循環結束。
迭代器是用來幫助我們記錄每次迭代訪問到的位置,當我們對迭代器使用next()函數的時候,迭代器會向我們返回它所記錄位置的下一個位置的數據。實際上,在使用next()函數的時候,調用的就是迭代器對象的_next_方法(Python3中是對象的_next_方法,Python2中是對象的next()方法)。所以,我們要想構造一個迭代器,就要實現它的_next_方法。但這還不夠,python要求迭代器本身也是可迭代的,所以我們還要為迭代器實現_iter_方法,而_iter_方法要返回一個迭代器,迭代器自身正是一個迭代器,所以迭代器的_iter_方法返回自身self即可。
一些術語的解釋:
1,迭代器協議:對象需要提供next()方法,它要麼返回迭代中的下一項,要麼就引起一個StopIteration異常,以終止迭代。
2,可迭代對象:實現了迭代器協議對象。list、tuple、dict都是Iterable(可迭代對象),但不是Iterator(迭代器對象)。但可以使用內建函數iter(),把這些都變成Iterable(可迭代器對象)。
3,for item in Iterable 循環的本質就是先通過iter()函數獲取可迭代對象Iterable的迭代器,然後對獲取到的迭代器不斷調用next()方法來獲取下一個值並將其賦值給item,當遇到StopIteration的異常後循環結束
Python自帶容器對象案例:
# 隨便定義一個listlistArray=[1,2,3]# 使用iter()函數iterName=iter(listArray)
print(iterName)# 結果如下:是一個列表list的迭代器# <list_iterator object at 0x0000017B0D984278>print(next(iterName))
print(next(iterName))
print(next(iterName))
print(next(iterName))#沒有迭代到下一個元素,直接拋出異常# 1# 2# 3# Traceback (most recent call last):# File "Test07.py", line 32, in <mole>#
Python中一個實現了_iter_方法和_next_方法的類對象,就是迭代器,如下案例是計算菲波那切數列的案例
class Fib(object):
def __init__(self, max):
super(Fib, self).__init__()
self.max = max def __iter__(self):
self.a = 0
self.b = 1
return self def __next__(self):
fib = self.a if fib > self.max: raise StopIteration
self.a, self.b = self.b, self.a + self.b return fib# 定義一個main函數,循環遍歷每一個菲波那切數def main():
# 20以內的數
fib = Fib(20) for i in fib:
print(i)# 測試if __name__ == '__main__':
main()
解釋說明:
在本類的實現中,定義了一個_iter_(self)方法,這個方法是在for循環遍歷時被iter()調用,返回一個迭代器。因為在遍歷的時候,是直接調用的python內置函數iter(),由iter()通過調用_iter_(self)獲得對象的迭代器。有了迭代器,就可以逐個遍歷元素了。而逐個遍歷的時候,也是使用內置的next()函數通過調用對象的_next_(self)方法對迭代器對象進行遍歷。所以要實現_iter_(self)和_next_(self)這兩個方法。
而且因為實現了_next_(self)方法,所以在實現_iter_(self)的時候,直接返回self就可以。
總結一句話就是:
在循環遍歷自定義容器對象時,會使用python內置函數iter()調用遍歷對象的_iter_(self)獲得一個迭代器,之後再循環對這個迭代器使用next()調用迭代器對象的_next_(self)。
注意點:_iter_(self)只會被調用一次,而_next_(self)會被調用 n 次,直到出現StopIteration異常。
Num02–>生成器
作用:
>延遲操作。也就是在需要的時候才產生結果,不是立即產生結果。12
注意事項:
>生成器是只能遍歷一次的。
>生成器是一類特殊的迭代器。123
分類:
第一類:生成器函數:還是使用 def 定義函數,但是,使用yield而不是return語句返回結果。yield語句一次返回一個結果,在每個結果中間,掛起函數的狀態,以便下次從它離開的地方繼續執行。
如下案例加以說明:
# 菲波那切數列def Fib(max):
n, a, b = 0, 0, 1
while n < max: yield b
a, b = b, a + b
n = n + 1
return '親!沒有數據了...'# 調用方法,生成出10個數來f=Fib(10)# 使用一個循環捕獲最後return 返回的值,保存在異常StopIteration的value中while True: try:
x=next(f)
print("f:",x) except StopIteration as e:
print("生成器最後的返回值是:",e.value)
第二類:生成器表達式:類似於列表
,只不過是把一對大括弧[]變換為一對小括弧()。但是,生成器表達式是按需產生一個生成器結果對象,要想拿到每一個元素,就需要循環遍歷。
如下案例加以說明:
# 一個列表xiaoke=[2,3,4,5]# 生成器generator,類似於list,但是是把[]改為()gen=(a for a in xiaoke)for i in gen:
print(i)#結果是:2345# 為什麼要使用生成器?因為效率。# 使用生成器表達式取代列表推導式可以同時節省 cpu 和 內存(RAM)。# 如果你構造一個列表(list)的目的僅僅是傳遞給別的函數,# 比如 傳遞給tuple()或者set(), 那就用生成器表達式替代吧!# 本案例是直接把列表轉化為元組kk=tuple(a for a in xiaoke)
print(kk)#結果是:(2, 3, 4, 5)# python內置的一些函數,可以識別這是生成器表達式,外面有一對小括弧,就是生成器result1=sum(a for a in range(3))
print(result1)# 列表推導式result2=sum([a for a in range(3)])
print(result2)