Estoy practicando estructura de datos, cree una clase llamada lista con la siguiente estructura:
public class Lista {
Persona[] datos = new Persona[10];
public boolean isEmpy(){
for(int i = 0; i < this.datos.length; i++){
if(this.datos[i] != null){
return false;
}
}
return true;
}
public int size(){
int size = 0;
for (Persona dato : datos) {
if (dato != null) size++;
}
return size;
}
public boolean isFull(){
return this.datos.length == size();
}
public void print(){
if(isEmpy()) System.out.println("La lista esta vacia");
else
for (Persona dato : datos) {
if (this.datos != null) System.out.println("[" + dato + "]");
else System.out.println("[ ]");
}
}
public void insert(int i, Persona obj){
if(isEmpy()) this.datos[0] = obj;
else if(isFull()) System.out.println("La lista esta llena");
else if(i > this.datos.length) System.out.println("No se puede insertar");
else{
if(i > size())i = size() +1;
for (int j = size(); j > i ; j--) {
this.datos[j] = this.datos[j - 1];
}
this.datos[i] = obj;
}
}
public void delete(int i){
if(i > size() || i < 0) System.out.println("Posición inválida");
else if(isEmpy()) System.out.println("No existe el elemento");
else{
for (int j = i; j < size(); j++) {
this.datos[j] = this.datos[j + 1];
}
this.datos[size()] = null;
}
}
public Persona get(int i){
if(isEmpy() || i > size() || Math.abs(i) > size()) return null;
if(i < 0) i = (size() - (i + 1)) -1;
return this.datos[i];
}
public int indexOf(Persona obj){
for(int i = 0; i < size(); i++){
if(this.datos[i].equals(obj)) return i;
}
return -1;
}
public void sort(){
Persona temp;
for(int i = 1; i < size(); i++){
for(int j = 0; j < (size() - 1); j++){
if(this.datos[j].compareTo(this.datos[j + 1]) > 0){
temp = datos[j];
datos[j] = datos[j + 1];
datos[j + 1] = temp;
}
}
}
}
public static void main(String[] args) {
Lista myList = new Lista();
System.out.println(myList.isEmpy());
myList.insert(1, new Persona("Sebastian", 21, 'M'));
myList.print();
System.out.println("-----------------------------");
myList.insert(2, new Persona("Hector", 22, 'M'));
myList.print();
System.out.println("-----------------------------");
myList.delete(8);
System.out.println("-----------------------------");
System.out.println(myList.get(-2));
System.out.println("-----------------------------");
myList.insert(3, new Persona("Karina", 22, 'F'));
myList.insert(4, new Persona("Adrian", 19, 'M'));
myList.insert(5, new Persona("Diego", 32, 'M'));
myList.insert(7, new Persona("Ross", 15, 'F'));
myList.insert(4, new Persona("Karina", 10, 'F'));
System.out.println("-----------------------------");
myList.print();
System.out.println("-----------------------------");
myList.sort();
myList.print();
}
}
Donde creo objetos de la clase Persona para llenar un array con objetos de la clase Persona, aquí el código:
class Persona{
String nombre;
int edad;
char genero;
Persona(String nombre, int edad, char genero){
this.nombre = nombre;
this.edad = edad;
this.genero = genero;
}
@Override
public String toString() {
return "Persona{" +
"nombre='" + nombre + '\'' +
", edad=" + edad +
", genero=" + genero +
'}';
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof Persona persona)) return false;
return edad == persona.edad &&
genero == persona.genero &&
Objects.equals(nombre, persona.nombre);
}
public int compareTo(Object o){
Persona p;
if(o instanceof Persona) p = (Persona) o;
else return -2;
if(this.equals(p)) return 0;
else{
if(this.nombre.compareTo(p.nombre) == 0){
if(this.edad == p.edad) return 0;
else if(this.edad > p.edad) return 1;
else return -1;
}
}
return this.nombre.compareTo(p.nombre);
}
}
Lo que tengo problemas es el método compareTo(); En el debbug realiza la comparación del objeto con null y me lanza la Exceptionaparece este error:
Exception in thread "main" java.lang.NullPointerException: Cannot invoke "Persona.compareTo(Object)" because "this.datos[j]" is null
¿Porqué tengo ese error?, ¿Cómo podría solucionarlo?