2017-03-04 7 views
0

Ich habe eine Funktion namens resolveClash, die ich ein Array senden (in diesem Fall - combinsFinal) mit 2 oder mehr Objekte in ihm vom Typ ModuleLecturerStudentCombination (das ist meine eigene Klasse). Im Wesentlichen ist die resizeClash-Funktion das Array in eine Arraylist, entfernt das erste Element/Objekt im Array und gibt dann die Liste zurück. Wenn ich jedoch den Status des zurückgegebenen Werts im Debugmodus (Eclipse) inspiziere, zeigt es, dass ein Nullwert am Ende der Arraylist hinzugefügt wurde.Entfernen von Objekt aus Arraylist verlässt null

Ich habe nachgeschlagen "Objekte richtig entfernen" usw., aber alles, was ich bisher versucht habe, wird nicht von der Null los. Die Null erscheint nach dem Entfernen. Ich habe gründlich überprüft, dass keine Null in usw. übergeben wird. Dies ist ein Problem, denn wenn ich dies benutze und später durch iteriere, nimmt es eine Null auf und gibt mir einen Null-Null-Fehler. Könnte mich jemand bitte wissen lassen, was ich falsch mache, oder mir in die richtige Richtung weisen?

Vielen Dank im Voraus!

picture displaying problem

resolveClash(combinsFinal); 


public ArrayList <ModuleLecturerStudentCombination> resolveClash(ModuleLecturerStudentCombination[] combinationArr){ 
    ArrayList<ModuleLecturerStudentCombination> copyCombinationList = new ArrayList<ModuleLecturerStudentCombination>(Arrays.asList(combinationArr)); 
    copyCombinationList.remove(0); 
    return copyCombinationList; 
} 
+0

Verwenden Sie Eclipse oder ähnliches und betrachten Sie das Ergebnis in der Debug-Perspektive? –

+1

'return new ArrayList <> (Arrays.asList (combinationArr) .subList (1, combinationArr.length()));' wäre einfacher. –

+1

Woher weißt du ***, dass die zurückgegebene 'ArrayList' ein' null' enthält? Woher wissen Sie, dass der Nullwert nicht bereits in dem Array enthalten war, das Sie an die Methode übergeben haben? Im Debug-Modus sehen Sie Implementierungsdetails der 'ArrayList', einschließlich der Einträge im Backing-Array, die NICHT Teil des Listenwerts sind. –

Antwort

2

... wenn ich den Zustand des zurückgegebenen Wert im Debug-Modus überprüfen, zeigt es, dass ein Nullwert hat auf das Ende der Arraylist hinzugefügt

Dies ist die normale Art, wie es funktioniert. Die Daten innerhalb der ArrayList werden in einem Array gespeichert, das dann in die Klasse eingebunden wird, um sich so zu verhalten, wie eine Liste es tut. Wenn Sie Elemente hinzufügen und das Array zu klein ist, wird ein größeres Objekt erstellt und die Objekte kopiert.

Wenn Sie jedoch einige entfernen, erstellt es kein neues kürzeres Array, aber lassen Sie einfach einige freie Stellen am Ende, aber geben Sie nur Zugriff auf die ersten, die ihre sein sollten. Im Debug-Modus sollten Sie auch eine Variable namens size sehen, die Ihnen sagt, welcher Teil des Arrays noch Teil der Liste ist.

0

In Ihrem Fall gibt die ArrayList Methode toArray(T []) kein neues Array zurück. Aus der Dokumentation:

[...] Wenn die Liste in das angegebene Array passt, wird es dort zurückgegeben. Andernfalls wird ein neues Array mit dem Laufzeittyp des angegebenen Arrays und der Größe dieser Liste zugeordnet.

Wenn die Liste paßt in dem angegebenen Array mit Platz übrig (das heißt die Anordnung mehr Elemente hat als die Liste), wobei das Element in dem Array unmittelbar nach dem Ende der Sammlung auf null gesetzt ist. [...]

Das Array combinsFinal hat eine größere Größe als die Liste so das Ergebnis direkt in denen sie mit einer zusätzlichen null zurückgeführt wird. In diesem Fall wird kein neues Array mit der richtigen Größe erstellt.

dies zu vermeiden, da Sie nicht die Größe eines Arrays nicht ändern können, können Sie einen neuen mit der gleichen Größe der Liste erstellen könnten, dann wäre dies korrekt funktionieren:

combinsFinal = new ModuleLecturerStudentCombination[temp.size()]; 
temp.toArray(combinsFinal); 

oder alternativ nur ein Pass Array ohne Größe, so dass die Methode gezwungen wird, ein neues Array mit der richtigen Größe zu erstellen und zurückzugeben:

combinsFinal = temp.toArray(new ModuleLecturerStudentCombination[0]); 
Verwandte Themen