2010-07-21 2 views
5

In meiner Java-Anwendung kompilieren und starten beide der folgenden und produzieren das gewünschte Ergebnis.Java - "Rotierende" Objekte in einer LinkedList - Ist LinkedList.addLast (LinkedList.removeFirst()) Gute oder schlechte Programmierung?

//"Rotate" the list items one place to the left. 
myLinkedList.addLast(myLinkedList.removeFirst()); 

Und eine „Rotation“ in der entgegengesetzten Richtung

//"Rotate" the list items one place to the right. 
myLinkedList.addFirst(myLinkedList.removeLast()); 

Both „Rotationen“ nur eine Zeile Code erfordert jeder, aber ich frage mich, ob dies der richtige Weg ist, um darüber zu gehen ? Gibt es Fallen in diesem Ansatz?

Gibt es einen besseren, robusteren, weniger fehleranfälligen Weg, das Gleiche wie oben zu tun, für den mehr als eine Codezeile benötigt wird, und wenn ja, warum?

Antwort

4

Scheint mir gut. Wenn Sie einen wirklich kreisförmigen Puffer hatten, der war, den vollen konnten Sie den "Anfang/Ende" Index gerade verschieben, aber ich denke, daß die verbundene Liste Annäherung ziemlich gut arbeitet. Insbesondere ist es immer noch O (1).

+0

Dies ist ziemlich nah an dem, was 'ArrayDeque' tut. – finnw

+0

Danke Jon, der "start \ end" -Index ist eine gute Idee, die ich mit verwenden werde. Der Code, den ich gepostet habe, ist Teil der Logik eines Sliding-Block-Puzzles, das ich in Swing entwickelt habe. –

2

Ich empfehle die Verwendung Collections.rotate.

+4

'Collections.rotate' benötigt O (N) Zeit. 'removeFirst' /' addLast' ist O (1). – finnw

+3

Das macht die Absicht klar, aber die Leistung ist viel schlimmer. Der Zugriff auf das erste/letzte Element einer verknüpften Liste und das Anhängen/Voranstellen ist in konstanter Zeit möglich, während Collections.rotate eine Zeit benötigt, die linear zur Listengröße ist. Jemand sollte wahrscheinlich eine Feature-Anfrage für einen speziellen Fall für LinkedList erstellen. –

+1

Die Frage hat keine Leistung als Voraussetzung. Vorzeitige Optimierung ist die Wurzel allen Übels usw. Wenn ich nach einer Verbesserung der Leistung suchte, gibt es wahrscheinlich andere Dinge, die viel wichtiger sind, wie die Verwendung einer Array-basierten Struktur. Daher bevorzuge ich den besseren, robusteren und weniger fehleranfälligen Weg. –

1

Ich würde es genau so implementieren, wie Sie haben.

myLinkedList.addLast(myLinkedList.removeFirst()); 

Die einzige Art, wie ich dieses Wesen „schlechte Programmierung“ sehen kann, ist, wenn die Liste zwischen Threads und Ihre Methode dreht sich ein Element von einem Ende zum anderen, ohne im Besitz einer Sperre freigegeben ist (ich bin mir nicht bewusst irgend gleichzeitige Queue Implementierung, die atomar drehen kann.)

+0

Danke für deine Eingabe, finnw. Obwohl ich kein professioneller Programmierer bin, bemühe ich mich immer, die Dinge richtig zu machen, daher meine "gute \ schlechte Programmierung?" Abfrage. –

+0

Und das m vor dem Variablennamen. –

+0

@Steve Kuo, ich vermute, dass Name für die Frage erfunden wurde und ist nicht der echte Variablenname, wie im Programm – finnw

Verwandte Themen