将指向 ArrayList 的 LinkedList 的指针转换为 String



我正在尝试制作一个自定义数组列表(协调(的链接列表(元素(,类型为对象 我正在寻找的输出是

Arraylist1 coord1 [2,5,1]
Arraylist2 coord2 [7,6,9]
LinkedList List1 [[2,5,1],[7,6,9]]

这是我的输出

[ 2 5 1 ] [ 7 6 9 ]

assignment1.arrayList@33909752

assignment1.arrayList@55f96302

我尝试使用toString方法,但没有运气 有人可以向我解释如何在没有内存指针的情况下打印输出。 我是否需要一种方法来访问某个位置(在 linkList 中(的特定元素并获取其坐标?

这是我的代码: 谢谢

public class arrayList {
private Object[] myList;
private int counter = 0;
private int capacity = 100;
public arrayList() {
    myList = new Object[this.capacity];
}
public Object get(int index) {
    if (index < counter) {
        return myList[index];
    } else {
        throw new ArrayIndexOutOfBoundsException();
    }
}
public void add(Object obj) {
    myList[counter++] = obj;
}
public Object remove(int index) {
    if (index < counter) {
        Object obj = myList[index];
        int temp = index;
        myList[index] = null;
        while (temp < counter) {
            myList[temp] = myList[temp + 1];
            myList[temp + 1] = null;
            temp++;
        }
        counter--;
        return obj;
    } else {
        throw new ArrayIndexOutOfBoundsException();
    }
}
public int size() {
    return counter;
}
public void display(Object obj1) {
    System.out.print("[");
    for (int i = 0; i < this.size(); i++) {
        System.out.print(" " + this.get(i) + " ");
    }
    System.out.print("]");
    System.out.println();
}

}

public class linkedList {
public Cube firstLink;
public Cube next;
linkedList() {
    firstLink = null;
}
public void insertFirstLink(Object e) {
    Cube newLink = new Cube(e);
    newLink.next = firstLink;
    firstLink = newLink;
}
public boolean isEmpty() {
    return (firstLink == null);
}
public Cube removeFirst() {
    Cube linkReference = firstLink;
    if (!isEmpty()) {
        firstLink = firstLink.next;
    } else {
        System.out.println("Empty Linked list!");
    }
    return linkReference;
}
public void display() {
    Cube theLink = firstLink;
    while (theLink != null) {
        theLink.display();
        theLink = theLink.next;
        System.out.println();
    }
}
public Cube find(Object obj) {
    Cube theLink = firstLink;
    if (!isEmpty()) {
        while (theLink.obj != obj) {
            if (theLink.next == null) {
                return null;
            } else {
                theLink = theLink.next;
            }
        }
    } else {
        System.out.println("Empty List!");
    }
    return theLink;
}
public Cube removeLink(Object obj) {
    Cube currentLink = firstLink;
    Cube previousLink = firstLink;
    while (currentLink.obj != obj) {
        if (currentLink.next == null) {
            return null;
        } else {
            previousLink = currentLink;
            currentLink = currentLink.next;
        }
    }
    if (currentLink == firstLink) {
        firstLink = firstLink.next;
    } else {
        previousLink.next = currentLink.next;
    }
    return currentLink;
}

}

public class Cube {
public Object obj;
public Cube next;
public Cube(Object obj) {
    this.obj = obj;
}
public void display() {
    obj.toString();
    System.out.println(obj);
}
public static void main(String[] args) {
    arrayList coord1 = new arrayList();
    coord1.add(new Integer(2));
    coord1.add(new Integer(5));
    coord1.add(new Integer(1));
    arrayList coord2 = new arrayList();
    coord2.add(new Integer(7));
    coord2.add(new Integer(6));
    coord2.add(new Integer(9));

    coord1.display(coord1);
    coord2.display(coord2);

    linkedList position1 = new linkedList();
    position1.insertFirstLink(coord1);
    position1.insertFirstLink(coord2);
    position1.display();

}

}

根据 API,https://docs.oracle.com/javase/7/docs/api/java/io/PrintStream.html#println(java.lang.Object(

你把一个对象放进去System.out.println(x)最终会调用String.valueOf(x),而 会调用x.toString()。把这个#1

linkedList.display()它将调用Cube.display(). Cube.display()将打印其封装的对象。该对象原来是一个arrayList.从 #1 开始,方法调用将变为 arrayList.toString() 。但是,arrayList没有实施toString().别担心,Java得到了你的支持。由于所有非基元类型都扩展了 Object,因此 arrayList 将具有从 Object 继承toString()方法。这是用于打印对象 ID 的对象实现。如果你不喜欢它,你可以在arrayList范围内定义你自己的 toString((。

更新 1

您可能想知道为什么第一arraylist可以打印出有意义的东西。这是因为您直接称其arraylist.display(),而不是System.out.println(coord1)

更新 2

您的代码中有一些反模式。

  1. 类名应为驼峰大小写 ,就像立方体一样,如数组列表,链接列表。
  2. 为什么arrayList.display()需要一个也引用自身的参数,但你从不使用它(即 obj1完全被忽略(? coord1.display()足够好,你不需要coord1.display(coord1)

您需要执行以下更改:

在你的arrayList类中,你需要改变方法display(Object obj1(并重写为String((方法:

public void display(Object obj1) {
    System.out.println(obj1);
}
@Override
public String toString() {
    StringBuilder sb = new StringBuilder();
    sb.append("[");
    for (int i = 0; i < counter - 1; i++) {
        sb.append(myList[i] + ",");
    }
    sb.append(myList[counter - 1] + "]");
    return sb.toString();
}

在类 linkedList 中,更改显示并覆盖为 String((,如下所示:

public void display() {
    System.out.println(this.toString());
}
@Override
public String toString() {
    StringBuilder sb = new StringBuilder();
    Cube temp = firstLink;
    sb.append("[");
    while (temp != null) {
        sb.append(temp.obj.toString());
        temp = temp.next;
        if (temp != null)
            sb.append(",");
    }
    sb.append("]");
    return sb.toString();
}

}

注意:它将以相反的顺序打印链表,因为您的 LinkedList 实现以相反的顺序存储数据。

最新更新