考え方二重リンクリストを保持しているクラスを構築する際に、私が最初に取り組んでいるクラスの概要を説明します(私はJavaのinbuiltクラスを使用していません)。オブジェクトから<myClass>への変換ができず、ポインタについての問い合わせ
class Node { //Forms the nodes of the list
private Object element;
private Node next;
private Node prev; //....other methods etc.
}
public class mylist implements Iterable<Node> {
Node head; Node tail; //....
@Override
public Iterator<Node> iterator() {
return new myit(this);
}
public class myit implements Iterator<Node> {
mylist set;
Node curr;
myit(mylist input) {
set=input;
curr=set.head;
}
@Override
public boolean hasNext() {
return (!(curr.getNext()==set.tail));
}
@Override
public Node next() {
if (this.hasNext()) return curr.getNext();
}
}
public class Myset {
mylist set;
//...
public void Delete(Object o) {
for(Node p: this.set) {
if(p.getElement().equals(o)) {
Node q=p.getNext();
p.getPrev().setNext(q);
q.setPrev(p);
break;
}}
}
public static void main(String[] as) {
Myset m=new Myset();
for(int i=1; i<5;i++) {
m.Insert(new Card(i));
}
for(Node n: m.set){
Card x=n.getElement(); //ERROR HERE
System.out.println(x.number());
}}
ここでのすべてのクラスは、別々のファイルで定義されています。カードは私が作成した別のクラスです。タイプミスマッチが表示されるエラーが表示されます:指定された行のObjectからCardに変換できません。どのように私はこれを克服するのですか? また、私は、How to implement iterator as an attribute of a class in Javaで提案されている方法を使用して、リンクリストクラスにイテレータ関数を使用するためにイテレータ関数をオーバーロードしていることにお気づきかもしれません。不具合に気づいたら、私は非常に感謝しています。 私はMysetのDeleteメソッドに関連する質問もありました。私はまだ上記のエラーのためにコードを実行することができませんでしたが、私はこれについて疑問を持っています。私はむしろJavaの新人です。私はCでポインタを使って作業するという考えに慣れています.pとqはmylistの元のノードのメモリ位置の 'ポインタ'として機能し、ノードを正常に削除しますか?
*「どのようにこれを克服するのですか?」* [generics](https://docs.oracle.com/javase/tutorial/java/generics/index.html)について学びます。または、あなたは昔の学校に行き、価値をキャストします。 – Andreas
ノード .. T要素 –
Tim
Node.getElement()はObjectを返します。返されたオブジェクトを、タイプCardの変数に代入しようとしています。したがって、コンパイラの意見は一致しません。オブジェクトがカードであることを確かめることはできません。だからあなたはキャストする必要があります: 'Card x =(Card)n.getElement();'。あなたのコードはひどくインデントされていて、変数名はひどいので、あなたのコードを読みにくくすることができます。あなたが正しく書式を設定し、良い名前を選んだら、自分のコードが何をするかということについて、はるかに良いアイデアを得るでしょう。メソッドは小文字で始まります。クラスは大文字で始まります。 camelCaseが使用されます。 –