ディレクトリ
イテレータ
出力のみの正のサイクルに一度データ。
一般的な方法:
方法 | 説明 |
---|---|
パブリックブールのhasNext() | データがnullであるか否かが判断された場合 |
空削除をデフォルト() | (使用することが困難)データを削除 |
公共E次の() | 現在のデータを取得します |
例:
List<String> list = new ArrayList<>();
list.add("1");
list.add("3");
list.add("5");
list.add("7");
list.add("9");
list.add("2");
list.add("4");
list.add("6");
list.add("8");
list.add("10");
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) { //判断下一个数据是否为空
String value = iterator.next(); //获取当前数据
if ("3".equals(value)) {
iterator.remove(); //删除数据,不会影响节点
} else {
System.out.println(value);
}
}
結果:
1
5
7
9
2
4
6
8
10
リストの中で、セット、コレクション、リストは、get()メソッドを持っている、あなたは、インデックスに応じてデータを取得することができます。
イテレータ出力get()メソッドのリスト:使用は、get()メソッドは、インデックスは、出力データと一致するたびに要求され、(N + 1)の時間複雑N、性能は強くありません。
反復子(双方向イテレータ出力)
データは、出力データは、逆であってもよいし、順次出力することができます。
内部ポインタの所望の出力の逆動作の存在下での反復子は、データポインタ到達は、その後、出力にので出力が正である必要があり、出力を反転する、反転させることができなければなりません。
一般的な方法:
方法 | 説明 |
---|---|
パブリックブールhasPrevious() | データが空であるか否かの決意 |
公共E前の(); | データを取得します |
例:
List<String> list = new ArrayList<>();
list.add("a");
list.add("c");
list.add("b");
list.add("m");
list.add("a");
list.add("d");
list.add("g");
list.add("j");
list.add("l");
list.add("q");
ListIterator<String> listIterator = list.listIterator();
System.out.print("正向输出:");
while (listIterator.hasNext()) {
System.out.print(listIterator.next() + "、");
}
System.out.print("\n反向输出:");
while (listIterator.hasPrevious()) {
System.out.print(listIterator.previous() + "、");
}
結果:
正向输出:a、c、b、m、a、d、g、j、l、q、
反向输出:q、l、j、g、d、a、m、b、c、a、
列挙
初期の反復の出力には、今だけのベクトルを使用することができます。
一般的な方法:
方法 | 説明 |
---|---|
パブリックブールhasMoreElements() | データがnullであるか否かが判断された場合 |
公共EのnextElement() | 現在のデータを取得します |
例:
Vector<String> vector = new Vector<>();
vector.add("a");
vector.add("b");
vector.add("c");
vector.add("d");
vector.add("e");
vector.add("f");
Enumeration<String> enumeration = vector.elements();
while(enumeration.hasMoreElements()){
System.out.println(enumeration.nextElement());
}
結果:
a
b
c
d
e
f
foreachの
Foreachループ出力は、カスタム出力するクラスオブジェクトは、反復処理可能インタフェースを実装する必要がある場合、定義されたイテレータ内部クラス内に実装されなければならないインタフェースでオーバーライドされたメソッドのイテレータイテレータオブジェクトのインスタンスを返します。
例:カスタムクラスの出力
public class Demo01 {
public static void main(String[] args) {
Ball ball = new Ball();
for (String b:ball) {
System.out.print(b+"、");
}
}
}
class Ball implements Iterable<String>{
private String[] brand = new String[]{"Hello","World"};
private int footer;
@Override
public Iterator<String> iterator() {
return new BallIter();
}
private class BallIter implements Iterator<String>{
@Override
public boolean hasNext() {
//表示数组存在数据
return Ball.this.footer < Ball.this.brand.length;
}
@Override
public String next() {
//返回数据
return brand[Ball.this.footer++];
}
}
}
結果:
Hello、World、
例:カスタム出力リストのforeach
public class Demo02 {
public static void main(String[] args) {
ILink<String> link = new LinkImpl<>();
link.add("1");
link.add("2");
for (String str:link) {
System.out.println(str+"、");
}
}
}
interface ILink<T> extends Iterable<T>{
/**
*链表数据增加
* @param data 数据
*/
public void add(T data);
}
class LinkImpl<T> implements ILink<T>{
private Node root;
private Node<T> last;
private Node currentNode;
@Override
public Iterator<T> iterator() {
this.currentNode = this.root;
return new LinkIter<>();
}
private static class Node<T>{
private T data;
private Node next;
public Node() {
}
public Node(T data) {
this.data = data;
}
}
@Override
public void add(T data) {
Node<T> node = new Node<>(data);
if(this.root == null){
this.root = node;
}else{
this.last.next = node;
}
this.last = node;
}
private class LinkIter<T> implements Iterator<T>{
@Override
public boolean hasNext() {
return LinkImpl.this.currentNode!=null;
}
@Override
public T next() {
T data = (T) LinkImpl.this.currentNode.data;
LinkImpl.this.currentNode = LinkImpl.this.currentNode.next;
return data;
}
}
}
結果:
1、
2、