2016-08-09 6 views
0

Ich versuche zu verstehen, Sortierung besser und ich bin auf ein Problem mit der java.lang.NullPointerException Ich weiß, dass es wegen der Null-Werte im Array ist. Also meine Frage ist, gibt es eine einfache Möglichkeit, diese Nullwerte zu entfernen oder das Array zu trimmen, so dass es nicht diesen Fehler geben wird? jedes Feedback geschätzttrimmen ein Array von Objekten

public class main { 

public static void main(String[] args){ 
     person[] persons = new person[6]; 
    persons[0]=new person("bill nye",34); 
    persons[1]=new person("frank white",64); 
    persons[2]=new person("sara poppa ",20); 
    persons[3]=new person("jess stoor",28); 
    persons[4]=new person("mike amato",20); 




    for(int i=0;i<persons.length;i++){ //before sorting 
    System.out.println(persons[i]); 
    } 

    insertionSort(persons); 
    System.out.println(); 

    for(int i=0;i<persons.length;i++){ //before sorting 
     System.out.println(persons[i]); 
    } 

} 
    public static void insertionSort(person[] persons) { 
      int in, out; 

      for (out = 1; out < persons.length; out++) { 
       person temp = persons[out]; 
       in = out; 

       while (in > 0 && persons[in - 1].getName().compareTo(temp.getName()) > 0) { 
        persons[in] = persons[in - 1]; 
        --in; 
       } 
       persons[in] = temp; 
       } 
      } 

}

public class person { 
private String Name; 
private int Age; 
public person(String name, int age){ 

this.Name=name; 
this.Age=age; 


} 
    public String getName(){ 
    return Name;  
    } 
    public void setName(String name) { 
     Name = name; 
    } 




    public int getAge() { 
     return Age; 
    } 
    public void setAge(int age) { 
     Age = age; 
    } 


    public String toString(){ 

     return Name + " " + Age; 
    } 

} 
+1

Sie setzen fünf Objekte in ein Array mit einer Länge von 6. Warum nicht einfach ein kleineres Array erstellen? – Mureinik

+0

'if (object.get (index) == null) remove (index)' Wenn Sie diese Bedingung in einer Schleife ausführen, sollte es funktionieren ' – DarkV1

+0

Es tut mir leid, dass dies eine dumme Frage sein könnte ich verstehe die if-Anweisung aber wie Würde ich den Index entfernen? –

Antwort

3

Es gibt zwei einfache Lösungen würden:

Wie Mureinik vorgeschlagen, können Sie einfach das Array eine Größe kleiner zu sein.

person[] persons = new person[5]; 

Sie erwähnen wollen auch einen Index aus dem Array zu entfernen, aber Sie können dies in Java technisch nicht tun. Sie können null die Werte, aber Sie können den Index tatsächlich nicht entfernen. Wenn dies die Funktionalität ist, die Sie langfristig verwenden möchten, um Array-Größen dynamisch zu handhaben, sollten Sie ein Objekt ArrayList oder List verwenden.

ArrayList<person> persons = new ArrayList<>(); 
persons.add(object); 

Und wenn man benötigt, um ein Objekt zu entfernen:

persons.remove(index); 
2

Sie sollten versuchen, die Größe des Arrays so klein wie möglich zu halten, um diese Fehler zu vermeiden. Oder verwenden Sie einfach eine ArrayList<person>, die diese Fehler vollständig eliminieren würde, während die Leistung relativ gering ist.

List<person> persons = new ArrayList<person>(); 
persons.add(new person("John Smith", 42)); 
persons.add(new person("Jane Smith", 31)); 

Wenn Sie noch ein Array verwenden Sie folgende Optionen verwenden:

Die triviale Ansatz, um die Nicht-Null-Objekte zu zählen wäre, und kopieren Sie sie in ein neues Array:

int nonNullCount = 0; 
for (person p : persons) 
    if (p != null) 
     nonNullCount++; 
person[] nonNullPersons = new person[nonNullCount]; 
int i = 0; 
for (person p : persons) 
    if (p != null) 
     nonNullPersons[i++] = p; 

Oder Sie könnten nur Java 8-Streams verwenden, um alle nicht-null-Objekte zu filtern:

person[] nonNullPersons = Arrays.stream(persons) 
      .filter(p -> p != null) //only keep non-null persons 
      .toArray(person[]::new); //create new array of persons 
2

sicher.

Sie können etwas tun:

private <T> T[] removeNullElements(T[] array) { 
    array = Arrays.copyOf(array, array.length); 

    int i = 0; 
    for(int j = 0; j < array.length; j++) { 
    if(array[j] != null) { 
     array[i++] = array[j]; 
    } 
    } 

    return Arrays.copyOfRange(array, 0, i); 
} 

Das durch Ihre Array-Schleifen und wird jedes Element null überspringen.

Es ist nicht sehr effizient, ich habe es gerade aus einem Code von vor ein paar Jahren - aber es funktioniert.

0

Sie das Array ohne die Verwendung eines List, mit der richtigen Anzahl von Elementen erstellen können, ohne die Anzahl der Elemente harte Kodierung, mit der Arrayinitialisierungssyntax:

person[] persons = new person[] { 
    new person("bill nye",34), 
    new person("frank white",64), 
    new person("sara poppa ",20), 
    new person("jess stoor",28), 
    new person("mike amato",20) 
}; 
0

Sie könnten nur das Array initialisieren mit den Werten.

person[] persons = { new person("bill nye",34), new person("frank white",64), 
        new person("sara poppa ",20), new person("jess stoor",28), 
        new person("mike amato",20) }; 

Oder ich würde empfehlen, eine ArrayList und geben Sie Ihre Objekte zu es zu benutzen.

ArrayList<person> persons = new ArrayList(); 
persons.add(new person("bill nye",34)); 
persons.add(new person("frank white",64)); 
persons.add(new person("sara poppa ",20)); 
persons.add(new person("jess stoor",28)); 
persons.add(new person("mike amato",20)); 
Verwandte Themen