I created a Person Object that takes a string and an integer. I created a Node class to take in type generic as input. When I debug, I can see the objects are created, and stored, but my output is just memory addresses of said so objects. I tried parsing my objects to strings in my toString()
method, but no luck. I have a hunch that the issue is the way I am declaring the generic datatype.
Here is my code:
Class Person
public class Person {
//variables
private String name;
private int age;
// default const.
public Person() {
name = " ";
age = 0;
}
// overloaded constructor
public Person(String name, int age) {
this.name = name;
this.age = age;
}
// methods
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
}
Class Node
package LinkedList;
public class Node <T> {
// added parameters for person object
T p;
Node nextNode;
public Node () {
}
public Node (T p) {
this.p = p;
}
// parse int data into string to simplify the unit test by not showing node memory locations
@Override
public String toString() {
return p.toString();
}
}
Linked List class
package LinkedList;
public class myLinkedList <T>{
//Nodes
Node head;
Node tail;
int size = 0;
// Generic method
public void add (T p){
Node node = new Node(p);
if(tail == null){
head = node; // if no previous tail the new node is the head
tail = node; // if no previous tail the new node is also the tail
}else {
tail.nextNode = node; // adds a node to the end of the list
tail = node; // the newest node is set to the tail;
}
size ++;
}
// Generic search method
public Node search (T p) {
//empty list
if (head == null)
return null;
// check if the first node is a match
if (head.p == p)
return head;
// assign node as iterator
Node node = head;
// iterate through linked list
while (node.nextNode != null) {
// assign the next node as current node
node = node.nextNode;
// compare current node's data to data
if (node.p == p)
System.out.println(" object found");
return node;
//exit when the last node is reached
}
return null;
}
public Node findPreviousNode (T p) {
// if the current node has no previous node (it's the head)
if(head.p == p)
return new Node();
Node node = head;
//go through list looking for desired node and return the one before it
while(node.nextNode != null) {
if(node.nextNode.p == p)
return node;
// if desired node is not found move onto next node
node = node.nextNode;
}
// returns null for previous node if desired node doesn't exist
return null;
}
public Node delete (T p){
// node selected to delete, initializes as null for a placeholder
Node nodeToReturn = null;
//empty list nothing to return
if(size == 0)
return null;
//list of only one node
if(size == 1) {
nodeToReturn = head;
head = null;
tail = null;
size --;
return nodeToReturn;
}
// find and delete last node
Node nodePrev = findPreviousNode(p);
if(nodePrev.p == null) {
head = head.nextNode;
size --;
} else if(nodePrev != null) {
if(tail.p == p) {
nodePrev.nextNode = null;
tail = nodePrev;
} else {
nodePrev.nextNode = nodePrev.nextNode.nextNode;
}
size --;
}
return null;
}
public void traverse() {
// checks for empty list and prints out the first node
if(head != null) {
Node node = head;
System.out.print(node);
// moves from node to node printing until it reaches null as nextNode
while(node.nextNode != null) {
node = node.nextNode;
System.out.print( " " + node.toString());
}
}
}
}
Main Class
import java.util.ArrayList;
import LinkedList.*;
public class main {
public static void main(String[] args) {
// implement linked list
System.out.println("\n\n Object Linked list");
myLinkedList peopleGroup = new myLinkedList();
peopleGroup.add(new Person("robert", 23));
System.out.println(peopleGroup.search("robert"));
peopleGroup.add(mike);
peopleGroup.add(marie);
peopleGroup.traverse();
}
}
Output: (I am guessing, same reason the search function is returning null is the culprit).
Object Linked list
null
Person@677327b6 Person@14ae5a5 Person@7f31245a
Process finished with exit code 0