質問
私の考えは特にどのように表示ページング制御を使用するときには、言語などにC#アプリケーションをJava.
している場合は x 項目したい表示切 y ページあたり、多くのページを開設が必要なの?
解決
たエレガントな解決方法:
int pageCount = (records + recordsPerPage - 1) / recordsPerPage;
他のヒント
に変換する浮動小数点の後になりそう巨大な廃棄物の時間はCPUます。
イアン-ネルソン-ソリューション:
int pageCount = (records + recordsPerPage - 1) / recordsPerPage;
簡略化できる
int pageCount = (records - 1) / recordsPerPage + 1;
AFAICS、これは当てはまりませんのオーバーフローグブランドンDuRette指摘するにとどまっており、がついてアフターサービスについても一度にする必要がなくなり、より快適な店舗のrecordsPerPage特場から高価な機能を取り出す価値から設定ファイルあります。
I.。これは非効率な場合はconfig.fetch_value使用データベースルックアップは何か:
int pageCount = (records + config.fetch_value('records per page') - 1) / config.fetch_value('records per page');
この変数では不要なのかもしれませんが、おそらく有メモリ上の影響およびはあまりにもかわいそうだと思うんタイピング:
int recordsPerPage = config.fetch_value('records per page')
int pageCount = (records + recordsPerPage - 1) / recordsPerPage;
これらはすべて一線のみを取り出しデータを一度:
int pageCount = (records - 1) / config.fetch_value('records per page') + 1;
C#の値段が高くなりますが、キャストの値をdoubleとしてMath.天井からダブル):
int nPages = (int)Math.Ceiling((double)nItems / (double)nItemsPerPage);
JavaにするべきなのにMath.ceil().
このべきだと考えている。またxの項目に分割による商品のページで、問題なのは凸凹した"使いやすさ"にこだわり、があれば、一部のページまでを追加したい一画面で見ることができます。
int x = number_of_items;
int y = items_per_page;
// with out library
int pages = x/y + (x % y > 0 ? 1 : 0)
// with library
int pages = (int)Math.Ceiling((double)x / (double)y);
整数型の数学解決するアンの提供も素敵ですが、足の整数オーバーフローバグ。仮にこれらの変数はすべての int
, のソリューションが書き換えられる使用 long
数学を回避するバグを修正:
int pageCount = (-1L + records + recordsPerPage) / recordsPerPage;
の場合 records
は long
, のバグが残っています。の弾性率解決しないバグを修正.
のバリアント Nick Berardiの回答 ることを避ける支店:
int q = records / recordsPerPage, r = records % recordsPerPage;
int pageCount = q - (-r >> (Integer.SIZE - 1));
注意: (-r >> (Integer.SIZE - 1))
さらに、符号ビットの r
, を繰り返し、32倍(コサインの拡張 >>
オペレーター.) この評価が0の場合 r
ゼロまたは負の場合は-1 r
である。うを差し引いてからの q
の効果を加える場合1 records % recordsPerPage > 0
.
のための記録==0のとき、rjmunroソリューションを与え1.の正しい解は0になります。いい記録>0(といったすべての想定recordsPerPage>0)、rjmunro溶液を正しい結果になっていて、他のオーバーフロー。
int pageCount = 0;
if (records > 0)
{
pageCount = (((records - 1) / recordsPerPage) + 1);
}
// no else required
すべての の整数解をより効率的 他の 浮動小数点ソリューション。
必要の拡張手法:
public static int DivideUp(this int dividend, int divisor)
{
return (dividend + (divisor - 1)) / divisor;
}
なしチェック(オーバーフロー, DivideByZero
, など、お気軽に追加されています。さて、気になメソッドの呼び出しオーバーヘッドを簡単に機能のようであinlinedのコンパイラになっているとは思えることができます。ございます!
P.S.を感じるかもしれませんがために役立てていただくこ意識することがで取得し、残り):
int remainder;
int result = Math.DivRem(dividend, divisor, out remainder);
他のインタビューを受けたことがあるのmod()関数または'%').がある場合はゼロ以外の残りをその後の増分を整数に。
い、以下では、取り扱うせが溢れる:
var totalPages = totalResults.IsDivisble(recordsperpage) ? totalResults/(recordsperpage) : totalResults/(recordsperpage) + 1;
この拡張が0の結果:
public static bool IsDivisble(this int x, int n)
{
return (x%n) == 0;
}
また、現在表示しているページ番号(思いがあります):
var currentPage = (int) Math.Ceiling(recordsperpage/(double) recordsperpage) + 1;
代替の除去分岐試験のためのゼロ:
int pageCount = (records + recordsPerPage - 1) / recordsPerPage * (records != 0);
い場合にスレッドセーフで、C#、やるべきなのC/C++.
C#用Math.天井の機能:
var pageCount= Math.Ceiling((double)myList.Count() / recordsPerPage);
Javaを使用Math.Ceil機能:
int n = (int) Math.ceil((double)myList.size() / recordsPerPage));
汎用方法、結果ときに対して繰り返し処理を実行きの金利
public static Object[][] chunk(Object[] src, int chunkSize) {
int overflow = src.length%chunkSize;
int numChunks = (src.length/chunkSize) + (overflow>0?1:0);
Object[][] dest = new Object[numChunks][];
for (int i=0; i<numChunks; i++) {
dest[i] = new Object[ (i<numChunks-1 || overflow==0) ? chunkSize : overflow ];
System.arraycopy(src, i*chunkSize, dest[i], 0, dest[i].length);
}
return dest;
}
また同様の必要性を変換分時間&。何をしたものを使用した:
int hrs = 0; int mins = 0;
float tm = totalmins;
if ( tm > 60 ) ( hrs = (int) (tm / 60);
mins = (int) (tm - (hrs * 60));
System.out.println("Total time in Hours & Minutes = " + hrs + ":" + mins);
以下のい丸より上記のソリューション、ものの性能による浮動小数点計算の0.5*rctDenominator):
uint64_t integerDivide( const uint64_t& rctNumerator, const uint64_t& rctDenominator )
{
// Ensure .5 upwards is rounded up (otherwise integer division just truncates - ie gives no remainder)
return (rctDenominator == 0) ? 0 : (rctNumerator + (int)(0.5*rctDenominator)) / rctDenominator;
}
だいたい浮動小数点本部としても活用し、天井の機能を回遊する価値の整数です。