導航:首頁 > 源碼編譯 > 常用分頁演算法

常用分頁演算法

發布時間:2022-06-28 23:59:19

❶ 什麼是虛擬存儲器請求式分頁存儲管理常用的頁面置換演算法有哪些試比較他們的性能。

虛擬存儲器(Virtual Memory):在具有層次結構存儲器的計算機系統中,自動實現部分裝入和部分替換功能,能從邏輯上為用戶提供一個比物理貯存容量大得多,可定址的「主存儲器」。虛擬存儲區的容量與物理主存大小無關,而受限於計算機的地址結構和可用磁碟容量。
最佳置換演算法(OPT)(理想置換演算法)
先進先出置換演算法(FIFO):
最近最久未使用(LRU)演算法
Clock置換演算法(LRU演算法的近似實現)
最少使用(LFU)置換演算法

❷ 在請求分頁系統中,常採用哪幾種頁面置換演算法

1. 可採用哪幾種方式將程序裝入內存?它們分別適用於何種場合?
a. 首先由編譯程序將用戶源代碼編譯成若干目標模塊,再由鏈接程序將編譯後形成的目標模塊和所需的-庫函數鏈接在一起,組成一個裝入模塊,再由裝入程序將裝入模塊裝入內存; b. 裝入模塊的方式有: 絕對裝入方式,可重定位方式和動態運行時裝入方式; c. 絕對裝入方式適用於單道程序環境下; d. 可重定位方式適用於多道程序環境下; e. 動態運行時裝入方式也適用於多道程序環境下.
2. 何謂靜態鏈接及裝入時動態鏈接和運行時的動態鏈接?
a. 靜態鏈接是指事先進行鏈接形成一個完整的裝入模塊,以後不再拆開的鏈接方---式;
b. 裝入時動態鏈接是指目標模塊在裝入內存時,邊裝入邊鏈接的鏈接方式;
c. 運行時的動態鏈接是將某些目標模塊的鏈接推遲到執行時才進行.
3. 在進行程序鏈接時,應完成哪些工作?
a. 對相對地址進行修改; b. 變換外部調用符號.
4. 在動態分區分配方式中,可利用哪些分區分配演算法?
a. 首次適應演算法; b. 循環首次適應演算法; c. 最佳適應演算法.
5. 在動態分區分配方式中,應如何將各空閑分區鏈接成空閑分區鏈?
應在每個分區的起始地址部分,設置一些用於控制分區分配的信息,以及用於鏈接各分區的前向指針;在分區尾部則設置一後向指針,通過前,後向指針將所有的分區鏈接成一個雙向鏈.
6. 為什麼要引入動態重定位?如何實現?
a. 為了在程序執行過程中,每當訪問指令或數據時,將要訪問的程序或數據的邏輯地址轉換成物理地址,引入了動態重定位. b. 可在系統中增加一個重定位寄存器,用它來裝入(存放)程序在內存中的起始地址,程序在執行時,真-
正訪問的內存地址是相對地址與重定位寄存器中的地址相加而形成的,從而實現動態重定位.
8. 在採用首次適應演算法回收內存時,可能出現哪幾種情況?應怎樣處理這些情況?
a. 回收區與插入點的前一個分區相鄰接,此時可將回收區與插入點的前一分區合並,不再為回收分區分配新表項,而只修改前鄰接分區的大小;
b. 回收分區與插入點的後一分區相鄰接,此時合並兩區,然後用回收區的首址作為新空閑區的首址,大-小為兩者之和;
c. 回收區同時與插入點的前後兩個分區鄰接,此時將三個分區合並,使用前鄰接分區的首址,大小為三區之和,取消後鄰接分區的表項;
d. 回收區沒有鄰接空閑分區,則應為回收區單獨建立一個新表項,填寫回收區的首址和大小,並根據其首址,插入到空閑鏈中的適當位置.
9. 在系統中引入對換後帶有哪些好處?
能將內存中暫時不運行的進程或暫時不用的程序和數據,換到外存上,以騰出足夠的內存空間,把已具備運行條件的進程或進程所需的程序和數據換入內存,從而大大地提高了內存的利用率.
10 為實現對換,系統應具備哪幾方面功能?
a. 對對換空間的管理; b. 進程的換出; c. 進程的換入.
11 在以進程為單位進行對換時,每次是否都將整個進程換出?為什麼?
a. 以進程為單位進行對換時,每次都將整個進程換出; b. 目的為了解決內存緊張的問題,提高內存的利用率.
13 請較詳細地說明,引入分段存儲管理是為了滿足用戶哪幾方面的需要?
a. 方便了編程; b. 實現了分段共享; c. 實現了分段保護; d. 實現了動態鏈接; e. 實現了動態增長.
14 在具有快表的段頁式存儲管理方式中,如何實現地址變換?
首先,必須配置一段表寄存器,在其中存放段表始址和段長TL. 進行地址變換時,先利用段號S,與段長TL進行比較,若S<TL,表示未越界,(若S>=TL,表示段號太大,訪問越界,產生越界中斷信號)於是利用段表始址和段號來求出該段對應的段表項在段表中的位置,從中求出該段的頁表始址,並利用邏輯地址中
的段內頁號P來獲得對應頁的頁表項位置,從中讀出該頁所在的物理塊號b,再用塊號b和頁內地址構成物理地址.
15 為什麼說分段系統較之分頁系統更易於實現信息共享和保護?
a. 對於分頁系統,每個頁面是分散存儲的,為了實現信息共享和保護,則頁面之間需要一一對應起來,為此需要建立大量的頁表項;
b. 而對於分段系統,每個段都從0開始編址,並採用一段連續的地址空間,這樣在實現共享和保護時.只需為所要共享和保護的程序設置一個段表項,將其中的基址與內存地址一一對應起來即可.
16 分頁和分段有何區別?
a. 分頁和分段都採用離散分配的方式,且都要通過地址映射機構來實現地址變換,這是它們的共同點;
b. 對於它們的不同點有三,第一,從功能上看,頁是信息的物理單位,分頁是為實現離散分配方式,以消減內存的外零頭,提高內存的利用率,即滿足系統管理的需要,而不是用戶的需要;而段是信息的邏輯單位,它含有一組其意義相對完整的信息,目的是為了能更好地滿足用戶的需要;
c. 頁的大小固定且由系統確定,而段的長度卻不固定,決定於用戶所編寫的程序;
d. 分頁的作業地址空間是一維的,而分段的作業地址空間是二維的.
17 試全面比較連續分配和離散分配方式.
a. 連續分配是指為一個用戶程序分配一個連續的地址空間,包括單一連續分配方式和分區式分配方式,前者將內存分為系統區和用戶區,系統區供操作系統使用,用戶區供用戶使用,是最簡單的一種存儲方式,但只能用於單用戶單任務的操作系統中;分區式分配方式分為固定分區和動態分區,固定分區是最簡單的
多道程序的存儲管理方式,由於每個分區的大小固定,必然會造成存儲空間的浪費;動態分區是根據進程的實際需要,動態地為之分配連續的內存空間,常用三種分配演算法: 首次適應演算法FF,該法容易留下許多難以利用的小空閑分區,加大查找開銷;循環首次適應演算法,該演算法能使內存中的空閑分區分布均勻,但
會致使缺少大的空閑分區;最佳適應演算法,該演算法也易留下許多難以利用的小空閑區;
b. 離散分配方式基於將一個進程直接分散地分配到許多不相鄰的分區中的思想,分為分頁式存儲管理,分段存儲管理和段頁式存儲管理. 分頁式存儲管理旨在提高內存利用率,滿足系統管理的需要,分段式存儲管理則旨在滿足用戶(程序員)的需要,在實現共享和保護方面優於分頁式存儲管理,而段頁式存儲管理
則是將兩者結合起來,取長補短,即具有分段系統便於實現,可共享,易於保護,可動態鏈接等優點,又能像分頁系統那樣很好的解決外部碎片的問題,以及為各個分段可離散分配內存等問題,顯然是一種比較有效的存儲管理方式;
c. 綜上可見,連續分配方式和離散分配方式各有各自的特點,應根據實際情況加以改進和利用.

❸ J2EE的高效率分頁演算法

top。。。用的sql server資料庫嗎?

如果不需要統計取出的總數的話,可以用真分頁,思路是說在頁面點下一頁的時候才去資料庫中取下一批數據,而不是一次取出

php 分頁演算法

這是我以前用的分頁,你看看吧,希望能幫到你。

<html>
<head>
<title>分頁</title>
</head>
<body>
<table align="center" border="1" width="500">
<tr>
<td>編號</td>
<td>用戶名</td>
<td>密碼</td>
<td>郵箱</td>
</tr>

<?php
$conn=mysql_connect("localhost","root","");
mysql_set_charset("utf8",$conn);
$db = mysql_select_db("bbs",$conn);
$rs = mysql_query("select * from userInfo");

$totalRow = mysql_num_rows($rs);//總記錄數
$currentPage = $_GET["currentPage"];//當前頁
if($currentPage == null){
$currentPage = 1;
}
$pageSize = 3;//每頁顯示的記錄數
$first = ($currentPage-1)*$pageSize;//起始值
$last = $first + $pageSize;//結束值
$totalPage = ceil($totalRow / $pageSize);//總頁數

if($last > $totalRow)
{
$last = $totalRow;
}
for($i=$first;$i<$last;$i++)
{
mysql_data_seek($rs,$i);//定位游標
$row = mysql_fetch_array($rs);
echo "<tr>";
echo " <td>{$row[0]}</td>";
echo " <td>{$row[1]}</td>";
echo " <td>{$row[2]}</td>";
echo " <td>{$row[3]}</td>";
echo "</tr>";
}
mysql_free_result($rs);
mysql_close($conn);
?>

<tr>
<td colspan="4" align="center">
<?php
if($currentPage == 1)
{
echo "首頁上一頁";
}
else
{
?>
<a href="fenye.php?currentPage=1">首頁</a>
<a href="fenye.php?currentPage=<?php echo $currentPage-1 ?>">上一頁</a>
<?php
}
if($currentPage == $totalPage)
{
echo "下一頁尾頁";
}
else
{
?>
<a href="fenye.php?currentPage=<?php echo $currentPage+1 ?>">下一頁</a>
<a href="fenye.php?currentPage=<?php echo $totalPage ?>">尾頁</a>
<?php
}
?>

<td>
</tr>
</table>
</body>
</html>

❺ 操作系統中什麼是分頁過程

3.請求分頁系統(1)請求分頁對頁表的擴充
在請求分頁系統中所使用的主要數據結構仍然是頁表。它對頁式系統中的頁表機制進行了擴充但其基本作用是實現由用戶地址空間到物理內存空間的映射。由於只將應用程序的一部分裝入內存,還有一部分仍在磁碟上,故需在頁表中增加若干項,供操作系統實現虛擬存儲器功能時參考。常見的系統中,一般對頁表的表項進行如下擴充:除了頁號對應的物理塊號,還增加了狀態位、修改位、外存地址和訪問欄位等。
·狀態位,用於指示該頁是否已經調入了內存。該位一般由操作系統軟體來管理,每當操作系統把一頁調人物理內存中時,置位。相反,當操作系統把該頁從物理內存調出時,復位。CPU對內存進行引用時,根據該位判斷要訪問的頁是否在內存中,若不在內存之中,則產生缺頁中斷。
·修改位,表示該頁調入內存後是否被修改過。當CPU以寫的方式訪問頁面時,對該頁表項中的修改位置位。該位也可由操作系統軟體來修改,例如,當操作系統將修改過頁面保存在磁碟上後,可將該位復位。
·外存地址,用於指出該頁在外存上的地址,供調人該頁時使用。
·訪問宇段,用於記錄本頁在一定時間內被訪問的次數,或最近已經有多長時間未被訪問。提供給相應的置換演算法在選擇換出頁面時參考。
(2)對缺頁中斷的支持
在請求分頁系統中,CPU硬體一定要提供對缺頁中斷的支持,根據頁表項中的狀態位判斷是否產生缺頁中斷。缺頁中斷是一個比較特殊的中斷,這主要體現在如下兩點:
·在指令的執行期間產生和處理缺頁信號。通常的CPU外部中斷,是在每條指令執行完畢後檢查是否有中斷請求到達。而缺頁中斷,是在一條指令的執行期間,發現要訪問的指令和數據不在內存時產生和處理的。
·一條指令可以產生多個缺頁中斷。例如,一條雙操作數的指令,每個操作數都不在內存中,這條指令執行時,將產生兩個中斷。CPU提供的硬體支持,還要體現在當從中斷處理程序返回時,能夠正確執行產生缺頁中斷的指令。
(3)頁面調度策略
虛擬存儲器系統通常定義三種策略來規定如何(或何時)進行頁面調度:調入策略、置頁策略和置換策略。
(4)置換演算法(replacementalgorithm)決定在需要調入頁面時,選擇內存中哪個物理頁面被置換。置換演算法的出發點應該是,把未來不再使用的或短期內較少使用的頁面調出。而未來的實際情況是不確定的,通常只能在局部性原理指導下依據過去的統計數據進行預測。常用的演算法有以下幾種:
·最佳演算法(optimal,OPT)。選擇「未來不再使用的」或「在離當前最遠位置上出現的」頁面被置換。這是一種理想情況,是實際執行中無法預知的,因而不能實現,只能用作性能評價的依據。
·最近最久未使用演算法(LeastRecentlyUsed,LRU)。選擇內存中最久未使用的頁面被置換,這是局部性原理的合理近似,性能接近最佳演算法。但由於需要記錄頁面使用時間的先後關系,硬體開銷太大。LRU可用如下的硬體機構幫助實現:
一個特殊的棧:把被訪問的頁面移到棧頂,於是棧底的是最久未使用頁面。每個頁面設立移位寄存器:被訪問時左邊最高位置1,定期右移並且最高位補0,於是寄存器數值最小的是最久未使用頁面。
·先進先出演算法(FIFO)。選擇裝入最早的頁面置換。可以通過鏈表來表示各頁的裝入時間先後。FIFO的性能較差,因為較早調入的頁往往是經常被訪問的頁,這些頁在FIFO演算法下被反復調入和調出,並且有Belady現象。所謂Belady現象是指:採用FIFO演算法時,如果對—個進程未分配它所要求的全部頁面,有時就會出現分配的頁面數增多但缺頁率反而提高的異常現象。Belady現象可形式化地描述為:一個進程戶要訪問M個頁,OS分配艫個內存頁面給進程P;對一個訪問序列S,發生缺頁次數為PE(占,N)。當N增大時,PE(S,N)時而增大時而減小。Belady現象的原因是FIFO演算法的置換特徵與進程訪問內存的動態特徵是矛盾的,即被置換的頁面並不是進程不會訪問的。
·時鍾(clock)演算法。也稱最近未使用演算法(NotRecentlyUsed,NRU),它是LRU和FIFO的折中。每頁有一個使用標志位(usebit),若該頁被訪問則置userbit=l,這是由CPU的硬體自動完成的。置換時採用一個指針,從當前指針位置開始按地址先後檢查各頁,尋找usebit=0的面作為被置換頁。指針經過的userbit=l的頁都修改userbit=O,這個修改的過程是操作系統完成的,最後指針停留在被置換頁的下一個頁。
·最不常用演算法(LeastFrequentlyUsed,LFU)。選擇到當前時間為止被訪問次數最少的頁面被置換。每頁設置訪問計數器,每當頁面被訪問時,該頁面的訪問計數器加1。發生缺頁中斷時,淘汰計數值最小的頁面,並將所有計數清零。
·頁面緩沖演算法(pagebuffering)。它是對FIFO演算法的發展,通過建立置換頁面的緩沖,這樣就有機會找回剛被置換的頁面,從而減少系統I/0的開銷。頁面緩沖演算法用FIFO演算法選擇被置換頁,把被置換的頁面放人兩個鏈表之一。即是如果頁面未被修改,就將其歸人到空閑頁面鏈表的末尾,否則將其歸人到已修改頁面鏈表。空閑頁面和已修改頁面,仍停留在內存中一段時間,如果這些頁面被再次訪問,只需較小開銷,被訪問的頁面就可以返還作為進程的內存頁。需要調入新的物理頁面時,將新頁面內容讀人到空閑頁面鏈表的第一項所指的頁面,然後將第一項刪除。當已修改頁面達到一定數目後,再將它們一起調出到外存,然後將它們歸人空閑頁面鏈表。這樣能大大減少I/O操作的次數。

❻ 求php數字分頁演算法

假設。
你只需要顯示當前頁數的前3頁和後3頁。
吶么只有3種可能。
第一個可能,用戶當前點擊的頁數未超過前3頁。需要顯示前7頁(前三頁和後三頁以及當前點擊的頁)省略7頁後面的頁。
第二個可能,用戶點擊的頁數以超過前三頁可是未到尾三頁。那麼就要省略當前頁數的前三頁後三頁之外的所有頁碼。
第三個可能,用戶點擊的頁數以超過尾三頁。那麼就省略最後7頁外的所有頁碼。

這是我寫的分頁碼中算省略頁碼的代碼。

$fornum = 10; //先聲明你要顯示的是幾個頁。
if($totalpage > $fornum) //判斷當前的所有頁數是否超過你要顯示的頁。如果沒超過。那就不用費事直接顯示所有頁碼就行叻。 如果超過進入循環。
{
//第一種可能。我這個是只顯示10個頁碼。
if($page<=6) //如果當前的頁碼大於等於6.也就是前面的頁碼不用省略。直接省略10個頁碼之後的頁就OK叻。
{
for($i=1; $i <= $fornum; $i++)//這就是循環顯示數字頁碼
{
if($page == $i ){
echo '<a href="javascript:;" class="on">'.$i.'</a>';
}
else{
echo '<a href="'.$_SERVER['PHP_SELF'].'?page='.$i.'" class="num">'.$i.'</a>';
}
}
echo '<a href="'.$_SERVER['PHP_SELF'].'?page='.$totalpage.'" class="num">...'.$totalpage.'</a>';
}
//注意阿。這不是第二個可能。這是第三個可能。因為第一個和第三個好判斷。而兩個都不滿足吶就是第二個可能叻。所以第二個不用判斷。這個條件也很好解釋。總的頁數減去當前頁數小於等於5的話。那麼就省略最後10頁以外的頁碼。
elseif(($totalpage-$page) <= 5)
{
echo '<a href="'.$_SERVER['PHP_SELF'].'?page=1" class="num">1...</a>';
for($i=$totalpage - ($fornum -1); $i <= $totalpage; $i++)//依舊是循環顯示數字頁碼
{
if($page == $i ){
echo '<a href="javascript:;" class="on">'.$i.'</a>';
}
else{
echo '<a href="'.$_SERVER['PHP_SELF'].'?page='.$i.'" class="num">'.$i.'</a>';
}
}
}
//這就是第二個可能叻。第一和第三的條件都不滿足那麼只有前沒到頭後沒著尾的情況叻。所以不用判斷直接顯示當前頁數的前幾頁和後幾頁。頭尾都省略。
else
{
echo '<a href="'.$_SERVER['PHP_SELF'].'?page=1" class="num">1...</a>';
for($i=$page - 4; $i < $page + 5; $i++)//循環顯示數字頁碼
{
if($page == $i ){
echo '<a href="javascript:;" class="on">'.$i.'</a>';
}
else{
echo '<a href="'.$_SERVER['PHP_SELF'].'?page='.$i.'" class="num">'.$i.'</a>';
}
}
echo '<a href="'.$_SERVER['PHP_SELF'].'?page='.$totalpage.'" class="num">...'.$totalpage.'</a>';
}
}
//這是最上面的那個if的,如果總頁碼沒超過你要顯示的頁碼就直接顯示所有的頁碼~
else
{
for($i=1; $i <= $totalpage; $i++)//仍是循環顯示數字頁碼
{
if($page == $i ){
echo '<a href="javascript:;" class="on">'.$i.'</a>';
}
else{
echo '<a href="'.$_SERVER['PHP_SELF'].'?page='.$i.'" class="num">'.$i.'</a>';
}
}
}

然後就木有叻。首頁尾頁上頁下頁的代碼我就不粘叻。 關於顯示固定頁碼的代碼就是這些。希望你能看懂。打的我手都酸了。。。

❼ 分頁的演算法問題 簡單的 謝了

//如果所給定的頁號大於或等於最大頁號,則返回最後幾條
for(int i=all.size();i>(all.size()-(total-1)*pageSize);i--){
res.add(all.get(i-1));
}

❽ 請問,如果從一個新聞資料庫查詢的文章內容太長了,想分頁該怎麼做

分頁瀏覽功能是常見的Web應用功能,對於MySQL資料庫來說可以很輕松的使用limit語句實現分頁,而對於SQL Server資料庫來說,常見的方法是使用數據集本身的游標實現分頁,這種方法對於少量數據來說沒什麼問題,但是對於稍大一點的數據量,例如幾十萬條數據,則查詢速度會降低很多,這里我介紹一種常用的技巧,只要簡單的重新構造一下查詢SQL語句,就能大幅提高查詢性能的方法。 在分頁演算法中,影響查詢速度的關鍵因素在於返回數據集的大小,我們先在數據表中設置一個名為id的主鍵,數值為自增量的整數,然後通過重構查詢SQL語句,就可以實現SQL查詢的優化,重構的SQL如下所示 select top 頁大小 * from table1 where id<= (select min (id) from (select top ((頁碼-1)*頁大小) id from table1 order by id desc) as T ) order by id desc 下面的JSP演示代碼中,intPageSize為頁大小,intPage為頁碼,id為主鍵,演示了操作一個t_Proct表,並加入各類查詢條件之後的重構SQL的主要語句,經過實際調試,經過這樣簡單優化後的SQL查詢速度遠遠高於優化前的查詢速度。 String sql=" from t_Proct where 1=1 and "; String ProctName = request.getParameter("ProctName"); if (ProctName!=null) sql=sql+"ProctName like '%" + ProctName + "%' and " ; sql=sql.substring(0,sql.length()-4); // 去掉尾部的 and 字元串 sql="select top " + String.valueOf(intPageSize) + " *" +sql+" and id <=(select min(id) from (select top " + String.valueOf(intPage*intPageSize) + " id " + sql + " order by id desc) as T) "; //通過子查詢加快速度 sql=sql+" order by id desc "; 轉載地址: http://www.williamlong.info/archives/1795.html

❾ SQL的幾種分頁演算法

利用SQL語句分頁要看你用的什麼資料庫。
Oracle資料庫可以使用ROWNUM或row_number(),例如:Select * from (select ROWNUM rn, t.* from table t) where rn between 11 and 20;
Select * from (select row_number() over (ORDER BY col1) rn, t.* from table t) where rn between 11 and 20;
SQLServer資料庫可以用Top或者row_number()函數,道理同上。
利用SQL分頁有局限性,就是針對不同的資料庫有不同的寫法,所以通常會在應用程序裡面做分頁通用性比較強。但是對於數據量非常龐大的應用來說,還是用SQL分頁比較適合。

❿ 關於Java的分頁演算法,急!

使用分頁類,直接調用就可以,代碼如下:

package com.godwin.news.util;

import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.util.ArrayList;

/**
* 分頁類,用於封閉分頁顯示信息
*
* @author javabs
*
*/
public class Pager {

// 當前頁
private int currentPage;
// 總頁數
private int totalPage;
// 總記錄數
private int totalRecord;
// 每頁條數
private int pageSize;
// 是否有下一頁
private int hasNext;
private ArrayList keys;
private ArrayList values;
// 查詢串
private String queryString;
// 首頁
private String firstLink;
// 上一頁
private String previousLink;
// 下一頁
private String nextLink;
// 尾頁
private String lastLink;
// 鏈接
private String forScriptLink;

public Pager(int pageSize, String queryString) {
keys = new ArrayList();
values = new ArrayList();
setQueryString(queryString);
setPageSize(pageSize);
}

public String getForScriptLink() {
if (keys.contains("toPage"))
removeKey("toPage");
String tmp = getQueryString();
if (tmp.length() == 0)
return "?";
else
return "?" + tmp + "&";
}

public int getCurrentPage() {
return currentPage;
}

public void setCurrentPage(String toPage) {
int tmpage = 1;
try {
tmpage = Integer.parseInt(toPage);
} catch (NumberFormatException e) {
tmpage = 1;
}
if (tmpage < 1)
tmpage = 1;
else if (tmpage > getTotalPage())
tmpage = getTotalPage();
currentPage = tmpage;
}

public String getFirstLink() {
return getQueryStr(1);
}

public int getHasNext() {
int i = 1;
if (getCurrentPage() >= getTotalPage())
i = 0;
return i;
}

public String getLastLink() {
return getQueryStr(getTotalPage());
}

public String getNextLink() {
return getQueryStr(currentPage == totalPage ? currentPage : (currentPage + 1));
}

public int getPageSize() {
return pageSize;
}

public void setPageSize(int pageSize) {
this.pageSize = pageSize;
}

public String getPreviousLink() {
return getQueryStr(currentPage == 1 ? currentPage : currentPage - 1);
}

public void setPreviousLink(String previousLink) {
this.previousLink = previousLink;
}

public String getQueryString() {
StringBuffer sb = new StringBuffer();
for (int i = 0; i < keys.size(); i++) {
String key = (String) keys.get(i);
String value = (String) values.get(i);
sb.append("&");
sb.append(key);
sb.append("=");
sb.append(value);
}

return sb.delete(0, 1).toString();
}

public void setQueryString(String queryString) {
if (queryString != null) {
String s[] = queryString.split("&");
for (int i = 0; i < s.length; i++) {
String s1[] = s[i].split("=");
if (s1.length == 2) {
keys.add(s1[0]);
values.add(s1[1]);
} else {
keys.add(s1[0]);
values.add("");
}
}

}
}

public int getTotalPage() {
return totalPage;
}

public void setTotalPage() {
if (totalRecord % pageSize == 0) {
totalPage = totalRecord / pageSize;
totalPage = totalPage == 0 ? 1 : totalPage;
}
else
totalPage = totalRecord / pageSize + 1;
}

public int getTotalRecord() {
return totalRecord;
}

public void setTotalRecord(int totalRecord) {
this.totalRecord = totalRecord;
setTotalPage();
}

public String[] getQueryParameterValues(String key) {
return getQueryParameterValues(key, "UTF-8");
}

public String[] getQueryParameterValues(String key, String decode) {
ArrayList ret = new ArrayList();
for (int i = 0; i < keys.size(); i++)
if (((String) keys.get(i)).equals(key))
try {
ret.add(URLDecoder.decode((String) values.get(i), decode));
} catch (UnsupportedEncodingException e) {
ret.add((String) values.get(i));
}

if (ret.size() == 0)
return null;
String strArr[] = new String[ret.size()];
for (int i = 0; i < ret.size(); i++)
strArr[i] = (String) ret.get(i);

return strArr;
}

public String getQueryParameter(String key) {
return getQueryParameter(key, "UTF-8");
}

public String getQueryParameter(String key, String decode) {
String value = "";
if (key != "toPage") {
try {
value = URLDecoder.decode(getValue(key), decode);
} catch (UnsupportedEncodingException e) {
value = getValue(key);
}
} else {
int tmpage = 1;
try {
value = getValue(key);
tmpage = Integer.parseInt(value);
} catch (NumberFormatException e) {
tmpage = 1;
} catch (NullPointerException e1) {
tmpage = 1;
}
if (tmpage < 1)
tmpage = 1;
else if (tmpage > getTotalPage())
tmpage = getTotalPage();
value = (new StringBuffer(String.valueOf(tmpage))).toString();
}
return value;
}

public void setQueryParameter(String key, String value) {
if (key.equals("toPage"))
removeKey(key);
keys.add(key);
values.add(value);
}

public String getQueryStr(int toPage) {
setQueryParameter("toPage", (new StringBuffer(String.valueOf(toPage))).toString());
return "?" + getQueryString();
}

private String getValue(String key) {
String ret = "";
for (int i = 0; i < keys.size(); i++) {
if (!((String) keys.get(i)).equals(key))
continue;
ret = (String) values.get(i);
break;
}

return ret;
}

private void removeKey(String key) {
for (int i = 0; i < keys.size(); i++) {
if (!((String) keys.get(i)).equals(key))
continue;
keys.remove(i);
values.remove(i);
break;
}

}

public static void main(String args[]) {
String str = "a=中文aa&b=2&c=3&c=4&c=5";
Pager page = new Pager(2, str);
page.setTotalRecord(10);
page.setCurrentPage("1");
System.out.println(page.getFirstLink());
System.out.println(page.getPreviousLink());
System.out.println(page.getNextLink());
System.out.println(page.getLastLink());
String s = page.getQueryParameter("a");
System.out.println("s: " + s);
}
}

閱讀全文

與常用分頁演算法相關的資料

熱點內容
怎麼投訴途虎app 瀏覽:35
安卓重力感應怎麼關 瀏覽:718
我的世界ios怎麼建伺服器地址 瀏覽:757
伺服器埠ip都是什麼意思 瀏覽:260
華為主題軟體app怎麼下 瀏覽:837
我們的圖片能夠收藏加密嗎 瀏覽:978
mysql空值命令 瀏覽:213
python整點秒殺 瀏覽:882
怎麼樣互傳app 瀏覽:292
python分布式抓包 瀏覽:36
輕量級php論壇 瀏覽:342
如何查看應用存儲在哪個文件夾 瀏覽:436
app開發項目范圍怎麼寫 瀏覽:76
androidjms 瀏覽:843
彈珠連貫解壓 瀏覽:243
程序員的網課 瀏覽:904
廣東加密狗防拷貝公司 瀏覽:450
rtf轉換pdf 瀏覽:350
單片機退出中斷 瀏覽:142
可以對單個內容加密的便簽 瀏覽:825