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

时间:2018-08-09 05:29:34

标签: java data-structures

我正在尝试创建类型为Object的自定义arrayList(coordinated)的linkedList(元素) 我正在寻找的输出是

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();


}

}

2 个答案:

答案 0 :(得分:0)

根据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将具有toString()从Object继承的方法。这是对象实现,用于打印对象ID。如果您不喜欢它,可以在arrayList范围内定义自己的toString()。

更新1

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

更新2

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

  1. 类名应位于camel case中 ,就像Cube一样,如ArrayList,LinkedList。
  2. 为什么arrayList.display()需要一个也引用自身的参数,但您却从未使用过它(即obj1被完全忽略了)? coord1.display()足够好,您不需要coord1.display(coord1)

答案 1 :(得分:0)

您需要进行以下更改:

在arrayList类中,您需要更改方法display(Object obj1)并重写toString()方法:

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类中,更改显示并覆盖toString(),如下所示:

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的实现是以相反的顺序存储数据。