我正在尝试制作一个自定义数组列表(协调(的链接列表(元素(,类型为对象 我正在寻找的输出是
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
您的代码中有一些反模式。
- 类名应为驼峰大小写 ,就像立方体一样,如数组列表,链接列表。
- 为什么
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 实现以相反的顺序存储数据。