红魔咖啡馆

头发越掉越多,头发越掉越少

0%

【CS61B】Lec10-Iterators, Object Methods

Lec10 - Iterators, Object Methods

Iterators

使用迭代器可以让自己的数据类型可以被迭代(支持for-each loop)

  • 需要让对应类实现Iterable接口
  • 具有Iterator方法来返回迭代器对象(实现一个嵌套类)
  • 迭代器需要具有hasNext()next()方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
package Lec10;

import java.util.Iterator;

public class ArraySet<T> implements Iterable<T> {
    private T[] items;
    private int size;

    public ArraySet(){
        items = (T[]) new Object[100];
        size = 0;
    }
    private class ArraySetIterator implements Iterator<T>{

        private int pos;
        ArraySetIterator(){
            pos = 0;
        }
        @Override
        public boolean hasNext() {
            if (pos<size){
                return true;
            }
            return false;
        }

        @Override
        public T next() {
            T itemToReturn = items[pos];
            pos++;
            return itemToReturn;
        }
    }
    public Iterator<T> iterator(){
        return new ArraySetIterator();

    }
    
}

(注:仅有迭代器部分,没有其他具体实现)

Object Method

Java中所有类都是Object的子类

toString()

给予一个object的字符串表示

println方法也调用了toString()方法

该方法类似于python中的repr方法,可以给类一个自定义的字符串输出形式

1
2
3
4
5
6
7
8
9
10
@Override
public String toString(){
    StringBuilder stringToReturn = new StringBuilder("{");
    for(T x: this){
        stringToReturn.append(x);
        stringToReturn.append(", ");
    }
    stringToReturn.append("}");
    return stringToReturn.toString();
}

this

this是当前对象的一个引用,可以使用this来访问自己的实例变量和方法

但java中this是不必须的

若方法中的局部变量和实例变量重名,此时必须要用this加以区分

equals()

equals()方法通过判断两个对象的地址来判断是否相同

当然,可以通过重写方法来改变其他判断相同的方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@Override
public boolean equals(Object o){
    if (o instanceof ArraySet uSet){
        if (this.size != uSet.size()){
            return false;
        }
        for (T x: this){
            if (!uSet.contains(x)){
                return false;
            }
        }
        return true;
    }
    return false;
}

其中,关键字A instanceof B的用处如下

  • 检查o是否指向类B,若不是返回false
  • 若是,返回true并将A作为B类并命名为B后面的名字
  • o是null也可以运行