Ich hab mal was gebastelt, Testprojekt anbei.
BalancedQueueCreator
Das UnitTest-Projekt wollte ich noch als Quasi-Doku mit hochladen, aber da sind die Packages zu groß. Daher - für die wenigen Interessierten - hier noch die Tests:
UnitTests
VB.NET-Quellcode
- Public Class BalancedQueueCreator(Of T)
- Private ReadOnly CountOfQueuesToCreate As Integer = 0
- Private ReadOnly Queues As New List(Of List(Of T))
- Public Sub New(CountOfQueuesToCreate As Integer)
- Me.CountOfQueuesToCreate = CountOfQueuesToCreate
- End Sub
- Public Function GetBalancedQueuesFrom(Elements As IEnumerable(Of T)) As IEnumerable(Of IEnumerable(Of T))
- If CountOfQueuesToCreate = 0 Then Return Nothing
- CreateSufficientQueues()
- PutAllElementsIntoFirstQueue(Elements)
- BalanceQueues()
- Return Queues
- End Function
- Private Sub CreateSufficientQueues()
- For i = 0 To CountOfQueuesToCreate - 1
- Queues.Add(New List(Of T))
- Next
- End Sub
- Private Sub PutAllElementsIntoFirstQueue(Elements As IEnumerable(Of T))
- Queues.First.AddRange(Elements)
- End Sub
- Private Sub BalanceQueues()
- Dim MoveFurtherElements As Boolean
- Do
- MoveFurtherElements = False
- For i = 0 To CountOfQueuesToCreate - 2
- If PutLastEntryIntoNextQueueFromQueue(i) Then MoveFurtherElements = True
- Next
- Loop While MoveFurtherElements
- End Sub
- Private Function PutLastEntryIntoNextQueueFromQueue(CurrentQueueIndex As Integer) As Boolean
- If Not MovingAnotherElementMakesSense(CurrentQueueIndex) Then Return False
- MoveLastElementToNextQueue(CurrentQueueIndex)
- PutLastEntryIntoNextQueueFromQueue(CurrentQueueIndex + 1)
- Return True
- End Function
- Private Sub MoveLastElementToNextQueue(CurrentQueueIndex As Integer)
- Queues(CurrentQueueIndex + 1).Insert(0, Queues(CurrentQueueIndex).Last)
- Queues(CurrentQueueIndex).RemoveAt(Queues(CurrentQueueIndex).Count - 1)
- End Sub
- Private Function MovingAnotherElementMakesSense(CurrentQueueIndex As Integer) As Boolean
- Return CurrentQueueIndex < Queues.Count - 1 AndAlso Not NextQueuesHaveSufficientEntries(CurrentQueueIndex)
- End Function
- Private Function NextQueuesHaveSufficientEntries(QueueIndex As Integer) As Boolean
- For i = QueueIndex + 1 To Queues.Count - 1
- If Queues(QueueIndex).Count - Queues(i).Count > 1 Then Return False
- Next
- Return True
- End Function
- End Class
Das UnitTest-Projekt wollte ich noch als Quasi-Doku mit hochladen, aber da sind die Packages zu groß. Daher - für die wenigen Interessierten - hier noch die Tests:
VB.NET-Quellcode
- Imports BalancedQueueCreator
- <TestClass()> Public Class BalancedQueueCreatorTests
- <TestMethod()> Public Sub CreateNoBalancedQueueWhenThereAreZeroQueuesToCreate()
- Dim TestArray = {""}
- Dim ResultingQueues = New BalancedQueueCreator(Of String)(0).GetBalancedQueuesFrom(TestArray)
- Assert.IsNull(ResultingQueues)
- End Sub
- <TestMethod()> Public Sub CreateOneBalancedQueueWhenThereIsOneQueueToCreate()
- Dim TestArray = {""}
- Dim ResultingQueues = New BalancedQueueCreator(Of String)(1).GetBalancedQueuesFrom(TestArray)
- Assert.AreEqual(1, ResultingQueues.Count)
- End Sub
- <TestMethod()> Public Sub OneEntryCreatesOneFilledQueue()
- Dim TestArray = {"1"}
- Dim ResultingQueues = New BalancedQueueCreator(Of String)(1).GetBalancedQueuesFrom(TestArray)
- Assert.AreEqual(1, ResultingQueues.First.Count)
- End Sub
- <TestMethod()> Public Sub OneEntryCreatesOneFilledQueueWithCorrectContent()
- Dim TestArray = {"1"}
- Dim ResultingQueues = New BalancedQueueCreator(Of String)(1).GetBalancedQueuesFrom(TestArray)
- Assert.AreEqual("1", ResultingQueues.First.First)
- End Sub
- <TestMethod()> Public Sub TwoEntriesCreateTwoFilledQueue()
- Dim TestArray = {"1", "2"}
- Dim ResultingQueues = New BalancedQueueCreator(Of String)(2).GetBalancedQueuesFrom(TestArray)
- Assert.AreEqual(1, ResultingQueues(0).Count)
- Assert.AreEqual(1, ResultingQueues(1).Count)
- End Sub
- <TestMethod()> Public Sub TwoEntriesCreateTwoFilledQueueWithCorrectContent()
- Dim TestArray = {"1", "2"}
- Dim ResultingQueues = New BalancedQueueCreator(Of String)(2).GetBalancedQueuesFrom(TestArray)
- Assert.AreEqual("1", ResultingQueues(0).First)
- Assert.AreEqual("2", ResultingQueues(1).First)
- End Sub
- <TestMethod()> Public Sub ThreeEntriesCreateThreeFilledQueue()
- Dim TestArray = {"1", "2", "3"}
- Dim ResultingQueues = New BalancedQueueCreator(Of String)(3).GetBalancedQueuesFrom(TestArray)
- Assert.AreEqual(1, ResultingQueues(0).Count)
- Assert.AreEqual(1, ResultingQueues(1).Count)
- Assert.AreEqual(1, ResultingQueues(2).Count)
- End Sub
- <TestMethod()> Public Sub FourEntriesCreateThreeFilledQueue211()
- Dim TestArray = {"1", "2", "3", "4"}
- Dim ResultingQueues = New BalancedQueueCreator(Of String)(3).GetBalancedQueuesFrom(TestArray)
- Assert.AreEqual(2, ResultingQueues(0).Count)
- Assert.AreEqual(1, ResultingQueues(1).Count)
- Assert.AreEqual(1, ResultingQueues(2).Count)
- End Sub
- <TestMethod()> Public Sub FourEntriesCreateThreeFilledQueue211WithCorrectContent()
- Dim TestArray = {"1", "2", "3", "4"}
- Dim ResultingQueues = New BalancedQueueCreator(Of String)(3).GetBalancedQueuesFrom(TestArray)
- Assert.AreEqual("1", ResultingQueues(0).First)
- Assert.AreEqual("2", ResultingQueues(0).Last)
- Assert.AreEqual("3", ResultingQueues(1).First)
- Assert.AreEqual("4", ResultingQueues(2).First)
- End Sub
- <TestMethod()> Public Sub FiveEntriesCreateThreeFilledQueue221WithCorrectContent()
- Dim TestArray = {"1", "2", "3", "4", "5"}
- Dim ResultingQueues = New BalancedQueueCreator(Of String)(3).GetBalancedQueuesFrom(TestArray)
- Assert.AreEqual("1", ResultingQueues(0).First)
- Assert.AreEqual("2", ResultingQueues(0).Last)
- Assert.AreEqual("3", ResultingQueues(1).First)
- Assert.AreEqual("4", ResultingQueues(1).Last)
- Assert.AreEqual("5", ResultingQueues(2).First)
- End Sub
- End Class
Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.
Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „VaporiZed“ ()