【问题标题】:Find a Bank account by entering accountnumber通过输入帐号查找银行帐户
【发布时间】:2016-04-24 06:27:08
【问题描述】:

在 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;
}

【问题讨论】:

  • 你遇到了什么错误?

标签: java list generics collections


【解决方案1】:

为了在 Java 中使用“forEach”循环,集合必须实现 java.lang.Iterable 并准备返回 Iterator。由于您显然没有实现任何迭代方法,因此您必须“手动”完成,如

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

【讨论】:

    【解决方案2】:

    UPD:如 cmets 中所说,Iterator 的包是java.util,所以如果您也不允许实现此包的接口,请使用循环迭代。


    为了能够使用 foreach 构造,必须为类实现Iterable&lt;T&gt; 接口。它应该提供一个Iterator&lt;T&gt; 和相应的iterator() 方法。

    List&lt;L&gt; 编写Iterator&lt;T&gt; 实现相当简单,它应该引用ListCell&lt;T&gt;。然后,在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&lt;T&gt; 接口添加到List&lt;L&gt; 并在您的iterator() 方法中创建一个指向第一个节点的ListCellIterator&lt;T&gt;

    class List<L> implements Iterable<L> {
    
        @Override
        public Iterator<L> iterator() {
            return new ListCellIterator<>(first);
        }
    
        //...
    }
    

    这将让您在 List&lt;L&gt; 上使用 foreach 循环:

    List<Account> accounts = new List<>();
    
    //...
    for (Account a: accounts) {
        System.out.println(a.accountNumber);
    }
    

    否则,可以使用传统循环在 List&lt;L&gt; 中搜索项目:

    //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;
    }
    

    【讨论】:

    • Iterator的包是...java.util,按要求是禁止的。
    • 非常感谢对我的帮助!我知道我们自己学习如何编写这些预先实现的方法,但这真的很耗时,尤其是对于像我这样的新手......
    猜你喜欢
    • 1970-01-01
    • 2011-12-16
    • 1970-01-01
    • 2019-04-14
    • 2014-02-01
    • 2013-12-18
    • 2012-05-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多