为什么这个java迭代器循环也是第一个元素?

时间:2018-01-07 17:29:55

标签: java arraylist iterator

import java.util.*;
public class IteratorDemo {

   public static void main(String args[]) {
      // Create an array list
      ArrayList al = new ArrayList();

      // add elements to the array list
      al.add("C");
      al.add("A");
      al.add("E");
      al.add("B");
      al.add("D");
      al.add("F");

      // Use iterator to display contents of al
      System.out.print("Original contents of al: ");
      Iterator itr = al.iterator();

      while(itr.hasNext()) {
         Object element = itr.next();
         System.out.print(element + " ");
      }
      System.out.println();
    }
  }

我不明白。如果al.iterator()返回al的第一个元素,为什么我在itr.next()中放置element(应该是我猜的第二个),然后打印element它会打印第一个元素而不是第二个元素吗?

我是java的新手。与c / c ++并行,Iterator就像指针一样,Iterator.next()就像解引用指针一样?当我在代码中执行操作时,有人可以向我解释实际上在低级别发生了什么吗?

3 个答案:

答案 0 :(得分:2)

调用iterator()会返回列表中元素的迭代器,而不是第一个元素。事实上,如果这返回了第一个元素,那么条件while(itr.hasNext())就没有任何意义。

只有当您调用next()时,才会返回迭代中的下一个元素。

因此,如果你想排除第一个元素,那么你需要做:

 if(itr.hasNext()) itr.next();
在循环之前

另外,我建议您使用参数化类型而不是原始类型,即ArrayList应声明为ArrayList<String> al = new ArrayList<>();,迭代器应声明为Iterator<String> itr = al.iterator();

鉴于在这种情况下您想要做的就是将元素打印到控制台,根本不需要使用Iterator,因为它更容易做到:

 al.forEach(element -> System.out.print(element + " "));

答案 1 :(得分:1)

al.iterator()不会返回al。的第一个元素。

enter image description here

你可以想象这张照片中的迭代器。方法iterator()提供了一个迭代器,以便您可以遍历列表的元素。当你调用它时,它不会给出第一个元素。每次调用next()方法时,它都会抓取下一个元素。这就是为什么当你第一次调用next()时它会给你第一个元素。

答案 2 :(得分:0)

<script type="text/javascript"> function clean_nick(nick) { nick = nick.toLowerCase(); nick = nick.replace(/[^a-z]/g, "") return nick; } function hash(nick) { var cleaned = clean_nick(nick); var h = 0; for(var i = 0; i < cleaned.length; i++) { var a = cleaned.charCodeAt(i) var b = (h << 6) var c = (h << 16) var d = h h = a + b + c - d; } console.log(h); return h; } function get_color(nick) { var nickhash = hash(nick); var deg = nickhash % 360; var h = deg < 0 ? 360 + deg : deg; var l = 50; if(h >= 30 && h <= 210) { l = 30; } var s = 20 + Math.abs(nickhash) % 80; return "hsl(" + h + "," + s + "%," + l + "%)"; } console.log(get_color("kIrb-839432-`~#$%^&*()_+{}|:<>?/,'.;[]=-_-")); </script> javadoc)将Iterator返回到集合(在本例中为您的ArrayList),而不是第一个元素。然后,您使用迭代器迭代集合的元素(使用//: Playground - noun: a place where people can play import UIKit extension Character { func unicodeScalarCodePoint() -> UInt32 { let characterString = String(self) let scalars = characterString.unicodeScalars return scalars[scalars.startIndex].value } } func cleanNick(nick: String) -> String { let lowerCaseNick = nick.lowercased() let noNumberNick = lowerCaseNick.components(separatedBy: CharacterSet.decimalDigits).joined() let noPunctuationNick = noNumberNick.components(separatedBy: CharacterSet.punctuationCharacters).joined() let noSymbolNick = noPunctuationNick.components(separatedBy: CharacterSet.symbols).joined() let finishedNick = noSymbolNick.replacingOccurrences(of: " ", with: "") return finishedNick } func hash(nick: String) -> Int { let cleaned = cleanNick(nick: nick) var h = 0 for char in cleaned { let a = char.unicodeScalarCodePoint() let b = (h << 6) let c = (h << 16) let d = h h = Int(Int(a) + Int(b) + Int(c) - Int(d)) } print(h) return h } func coloredNick(nick: String) -> String { let nickHash = hash(nick: nick) let deg = nickHash % 360 let h = deg < 0 ? 360 + deg : deg var l = 50 if (h >= 30 && h <= 210) { l = 30 } let s = 20 + abs(nickHash) % 80 return "hsl(\(h),\(s),\(l))" } print(coloredNick(nick: "kIrb-839432-`~#$%^&*()_+{}|:<>?/,'.;[]=-_-")) let lastXcoVar = lastView.center.x UIView.animateWithDuration(0.5, animations: { lastView.center.x = nextView.center.x nextView.center.x = lastXcoVar }) { _ in self.stackview.exchangeSubviewAtIndex(<index of lastView>, withSubviewAtIndex: <index of nextView>) }