Ich denke insbesondere darüber nach, wie Paginierungssteuerelemente angezeigt werden, wenn eine Sprache wie C # oder Java verwendet wird.
Wenn ich x Elemente habe, die in Blöcken von y pro Seite angezeigt werden sollen, wie viele Seiten werden benötigt?
x
durch teilbar isty
,y/x + 1
wäre eine zu hoch.Antworten:
Eine elegante Lösung gefunden:
Quelle: Number Conversion, Roland Backhouse, 2001
quelle
pageCount = -((-records) // recordsPerPage)
.Die Konvertierung in Gleitkomma und zurück scheint auf CPU-Ebene eine enorme Zeitverschwendung zu sein.
Ian Nelsons Lösung:
Kann vereinfacht werden zu:
AFAICS, dies hat nicht den Überlauffehler, auf den Brandon DuRette hingewiesen hat, und da er nur einmal verwendet wird, müssen Sie die recordsPerPage nicht speziell speichern, wenn sie von einer teuren Funktion stammt, um den Wert aus einer Konfigurationsdatei oder abzurufen etwas.
Das heißt, dies könnte ineffizient sein, wenn config.fetch_value eine Datenbanksuche verwendet hat oder so:
Dadurch wird eine Variable erstellt, die Sie nicht wirklich benötigen. Dies hat wahrscheinlich (geringfügige) Auswirkungen auf den Speicher und ist einfach zu viel Eingabe:
Dies ist alles eine Zeile und ruft die Daten nur einmal ab:
quelle
-1 / 1 + 1 = 0
. Dies ist zwar kein sehr häufiges Ereignis, es ist jedoch wichtig zu berücksichtigen, ob Benutzer die Seitengröße anpassen können. Erlauben Sie Benutzern entweder nicht, eine Seitengröße von 1 zu haben, überprüfen Sie die Seitengröße oder beides (wahrscheinlich vorzuziehen, um unerwartetes Verhalten zu vermeiden).Für C # besteht die Lösung darin, die Werte in ein Double umzuwandeln (da Math.Ceiling ein Double verwendet):
In Java sollten Sie dasselbe mit Math.ceil () tun.
quelle
int
da je nach EingabetypMath.Ceiling
eindouble
oder zurückgegebendecimal
wird.Dies sollte Ihnen geben, was Sie wollen. Sie werden auf jeden Fall x Elemente geteilt durch y Elemente pro Seite wollen. Das Problem ist, wenn ungerade Zahlen auftauchen. Wenn es also eine Teilseite gibt, möchten wir auch eine Seite hinzufügen.
quelle
Die von Ian bereitgestellte ganzzahlige mathematische Lösung ist nett, leidet jedoch an einem ganzzahligen Überlauffehler. Unter der Annahme, dass alle Variablen vorhanden sind
int
, könnte die Lösung neu geschrieben werden, umlong
Mathematik zu verwenden und den Fehler zu vermeiden:int pageCount = (-1L + records + recordsPerPage) / recordsPerPage;
Wenn a
records
istlong
, bleibt der Fehler bestehen. Die Modullösung hat den Fehler nicht.quelle
Eine Variante von Nick Berardis Antwort , die einen Zweig vermeidet:
Hinweis:
(-r >> (Integer.SIZE - 1))
besteht aus dem Vorzeichenbit vonr
, das 32 Mal wiederholt wird (dank der Vorzeichenerweiterung des>>
Operators). Diesr
ergibt 0, wenn es Null oder negativ ist, -1, wennr
es positiv ist. Das Subtrahieren vonq
bewirkt also, dass 1 if addiert wirdrecords % recordsPerPage > 0
.quelle
Für Datensätze == 0 ergibt die Lösung von rjmunro 1. Die richtige Lösung ist 0. Wenn Sie jedoch wissen, dass Datensätze> 0 sind (und ich bin sicher, dass wir alle recordsPerPage> 0 angenommen haben), liefert die Lösung von rjmunro korrekte Ergebnisse und hat keine der Überlaufprobleme.
Alle ganzzahligen mathematischen Lösungen sind effizienter als alle Gleitkomma-Lösungen.
quelle
Benötigen Sie eine Erweiterungsmethode:
Keine Kontrollen hier (Überlauf,
DivideByZero
usw.). Wenn Sie möchten, können Sie diese hinzufügen. Übrigens, für diejenigen, die sich Sorgen über den Aufwand für Methodenaufrufe machen, könnten einfache Funktionen wie diese sowieso vom Compiler eingebunden werden, daher denke ich nicht, dass dies von Belang ist. Prost.PS Vielleicht ist es auch nützlich, sich dessen bewusst zu sein (der Rest wird erhalten):
quelle
DivideUp(4, -2)
Gibt 0 zurück (sollte -2 sein). Dies gilt nur für nicht negative Ganzzahlen, die aus der Antwort oder der Funktionsschnittstelle nicht ersichtlich sind.Eine andere Alternative ist die Verwendung der Funktion mod () (oder '%'). Wenn der Rest ungleich Null ist, erhöhen Sie das ganzzahlige Ergebnis der Division.
quelle
Ich mache folgendes, behandle eventuelle Überläufe:
Verwenden Sie diese Erweiterung, wenn 0 Ergebnisse vorliegen:
Auch für die aktuelle Seitenzahl (wurde nicht gefragt, könnte aber nützlich sein):
quelle
Alternative zum Entfernen der Verzweigung beim Testen auf Null:
Nicht sicher, ob dies in C # funktioniert, sollte in C / C ++ funktionieren.
quelle
Eine generische Methode, über deren Ergebnis Sie iterieren können, kann von Interesse sein:
quelle
Lists.partition(List, int)
) und ironischerweise leidet diesize()
Methode der resultierendenList
(abr09
) unter dem in Brandon DuRettes Antwort erwähnten Überlauffehler .Ich hatte ein ähnliches Bedürfnis, bei dem ich Minuten in Stunden und Minuten umrechnen musste. Was ich benutzt habe war:
quelle
Folgendes sollte besser runden als die oben genannten Lösungen, jedoch auf Kosten der Leistung (aufgrund der Gleitkommaberechnung von 0,5 * rctDenominator):
quelle
Sie möchten eine Gleitkommadivision durchführen und dann die Deckenfunktion verwenden, um den Wert auf die nächste Ganzzahl aufzurunden.
quelle