输入accountnumber查找银行帐户

时间:2016-01-18 22:58:14

标签: java list generics collections

在2天内,我有编码到期的任务,我根本无法为我的任务找到解决方案。

任务:在我们编写自己的链接数据结构之前。现在我们应该实现泛型来保存这个结构中的不同对象(在我们的例子中是一个银行,有账户,账户持有人,注册表)。

我们不允许使用java.util中的任何方法。我们只允许使用java.io和java.lang。

我很难找到一种搜索我的清单的方法。

例如这段代码:

class Account {

int accountNumber;
int bankCode;
int balance;

 Account(int bankCode, int accountNumber) {
    this.bankCode = bankCode;
    this.accountNumber = accountNumber;
    this.balance = 1000;
}

我想通过使用int accountNumber作为参数进行搜索来查找帐户。 我尝试使用foreach循环,但是对于我的自定义列表,它不适用。 以下是自定义列表的基本设计:

class List<L> {
ListCell<L> first = null;

(methods like add ... )
class ListCell<L> {

ListCell<L> next = null;
L content = null;

ListCell(L content, ListCell<L> next) {
this.content = content;
this.next = next;

 }
}

我尝试了这个,但得到了上面提到的错误:

<L> boolean contains (L l, List<L> list) {
for (L m : list) if (m.equals(l)) return true;
return false;
}

2 个答案:

答案 0 :(得分:2)

为了使用&#34; forEach&#34;在Java中循环,集合必须实现java.lang.Iterable并准备返回Iterator。由于你显然没有实现任何迭代方法,你必须这样做&#34;手动&#34;,如

for (L p=first; p!=null; p=p.next)
{
    ...
}

答案 1 :(得分:1)

UPD :正如评论中正确说明的那样,Iterator的包是java.util,因此,如果您不允许实施以下接口:这个包也是,使用循环迭代。

为了能够使用foreach构造,必须为类实现Iterable<T>接口。它应该提供Iterator<T>相应的iterator()方法。

Iterator<T>编写List<L>实现非常简单,它应该引用ListCell<T>。然后,在hasNext()调用时,当且仅当next存在时,它才会返回true,并且在next()调用它应该向前移动,返回存储在next中的项目:

class ListCellIterator<T> implements Iterator<T> {

    private ListCell<T> next;

    public ListCellIterator(ListCell<T> next) {
        this.next = next;
    }

    @Override
    public boolean hasNext() {
        return next != null;
    }

    @Override 
    public T next() {
        T result = next.content;
        next = next.next;
        return result;
    }
}

然后,您要将Iterable<T>界面添加到List<L>,只需创建ListCellIterator<T>指向iterator()方法中的第一个节点:

class List<L> implements Iterable<L> {

    @Override
    public Iterator<L> iterator() {
        return new ListCellIterator<>(first);
    }

    //...
}

这将允许您在List<L>上使用foreach循环:

List<Account> accounts = new List<>();

//...
for (Account a: accounts) {
    System.out.println(a.accountNumber);
}

否则,您可以使用传统循环搜索List<L>中的项目:

//it is better to make this a member method of List<L>

public boolean contains (L l) {
    ListCell<L> next = first;
    while (next != null) {
        if (next.content == null ? l == null : next.content.equals(l)) {
            return true;
        }
        next = next.next;
    }
    return false;
}