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