//----------------先寫了個,功能是實現(xiàn)了,有待改進-----------
為下陸等地區(qū)用戶提供了全套網(wǎng)頁設(shè)計制作服務,及下陸網(wǎng)站建設(shè)行業(yè)解決方案。主營業(yè)務為成都網(wǎng)站設(shè)計、成都做網(wǎng)站、外貿(mào)網(wǎng)站建設(shè)、下陸網(wǎng)站設(shè)計,以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務,秉承以專業(yè)、用心的態(tài)度為用戶提供真誠的服務。我們深信只要達到每一位用戶的要求,就會得到認可,從而選擇與我們長期合作。這樣,我們也可以走得更遠!
import java.util.ArrayList;
import java.util.List;
/**
* 現(xiàn)有ListSourceBean類型的List對象,
* 現(xiàn)在需要將該List對象中a是奇數(shù)或者b100的對象過濾掉,
* 請用責任鏈模式實現(xiàn)此段代碼。
* @author Administrator
*
*/
public class Chain_test1 {
public static void main(String[] args) {
ListSourceBean list = new ArrayListSourceBean();
SourceBean bean1 = new SourceBean(1, 100);
SourceBean bean2 = new SourceBean(2, 200);
SourceBean bean3 = new SourceBean(3, 100);
SourceBean bean4 = new SourceBean(4, 100);
SourceBean bean5 = new SourceBean(5, 20);
SourceBean bean6 = new SourceBean(6, 200);
list.add(bean1);
list.add(bean2);
list.add(bean3);
list.add(bean4);
list.add(bean5);
list.add(bean6);
System.out.println("過濾前List中的內(nèi)容");
printList(list);
// 裝配 鏈條
Filter oddFilter = new OddFilter();
//為了保持Filter里面的邏輯不混亂,OddFilter僅過濾奇數(shù),CompareFilter僅僅過濾b100
//這里對奇數(shù)過濾兩次,
//即,過濾掉b100和a是奇數(shù) 共存的情形
Filter oddFilter2 = new OddFilter();
Filter compareFilter = new CompareFilter();
oddFilter.setFilter(null);
compareFilter.setFilter(oddFilter);
oddFilter2.setFilter(compareFilter);
// 進行過濾
oddFilter2.doFilter(list);
System.out.println("\n過濾后List中的內(nèi)容");
printList(list);
}
public static void printList(ListSourceBean list){
for(SourceBean s: list){
System.out.print(s.toString());
}
}
}
class Filter{
private Filter filter;
public void doFilter(ListSourceBean list){
if (filter != null){
filter.doFilter(list);
}else{
System.out.println("處理結(jié)束");
}
}
public void setFilter(Filter filter){
this.filter = filter;
}
}
/**
* 僅僅過濾b100
*/
class CompareFilter extends Filter{
public void doFilter(ListSourceBean list){
for(int i= 0; i list.size(); i++){
if(list.get(i).getB() 100 ){//b100
list.remove(i);//移除該對象
}else{//交給其他Filter處理
super.doFilter(list);
}
}
}
}
/**
* 僅過濾a為奇數(shù)
*/
class OddFilter extends Filter{
public void doFilter(ListSourceBean list){
for(int i= 0; i list.size(); i++){
if(list.get(i).getA() % 2 != 0){//非偶數(shù)
list.remove(i);//移除該對象
}else{//交給其他Filter處理
super.doFilter(list);
}
}
}
}
class SourceBean {
private int a;
private int b;
public SourceBean(int a, int b){
this.a = a;
this.b = b;
}
public SourceBean(){
}
public String toString(){
return "[a="+a+", b="+b+"] ";
}
public int getA() {
return a;
}
public void setA(int a) {
this.a = a;
}
public void setB(int b) {
this.b = b;
}
public int getB() {
return b;
}
}
//------------------------執(zhí)行結(jié)果----------------------------
過濾前List中的內(nèi)容
[a=1, b=100] [a=2, b=200] [a=3, b=100] [a=4, b=100] [a=5, b=20] [a=6, b=200]
過濾后List中的內(nèi)容
[a=4, b=100]
// ---greatwqs----
import java.io.*;
public class List {
// 用變量來實現(xiàn)表頭
private Node Head = null;
private Node Tail = null;
private Node Pointer = null;
private int Length = 0;
/** 清空整個鏈表 */
public void deleteAll() {
Head = null;
Tail = null;
Pointer = null;
Length = 0;
}
/** 鏈表復位,使第一個結(jié)點 成為當前結(jié)點 */
public void reset() {
Pointer = null;
}
/** 判斷鏈表是否為空 */
public boolean isEmpty() {
return (Length == 0);
}
/** 判斷當前結(jié)點是否 為最后一個結(jié)點 */
public boolean isEnd() {
if (Length == 0)
throw new java.lang.NullPointerException();
else if (Length == 1)
return true;
else
return (cursor() == Tail);
}
/** 返回當前結(jié)點的下一個結(jié)點的值, 并使其成為當前結(jié)點 */
public Object nextNode() {
if (Length == 1)
throw new java.util.NoSuchElementException();
else if (Length == 0)
throw new java.lang.NullPointerException();
else {
Node temp = cursor();
Pointer = temp;
if (temp != Tail)
return (temp.next.data);
else
throw new java.util.NoSuchElementException();
}
}
/** 返回當前結(jié)點的值 */
public Object currentNode() {
Node temp = cursor();
return temp.data;
}
/** 在當前結(jié)點前插入一個結(jié)點, 并使其成為當前結(jié)點 */
public void insert(Object d) {
Node e = new Node(d);
if (Length == 0) {
Tail = e;
Head = e;
} else {
Node temp = cursor();
e.next = temp;
if (Pointer == null)
Head = e;
else
Pointer.next = e;
}
Length++;
}
/** 返回鏈表的大小 */
public int size() {
return (Length);
}
/**
* 將當前結(jié)點移出鏈表,下一個結(jié)點成為當前結(jié)點, 如果移出的結(jié)點是最后一個結(jié)點,則第一個結(jié)點成為當前結(jié)點
*/
public Object remove() {
Object temp;
if (Length == 0)
throw new java.util.NoSuchElementException();
else if (Length == 1) {
temp = Head.data;
deleteAll();
} else {
Node cur = cursor();
temp = cur.data;
if (cur == Head)
Head = cur.next;
else if (cur == Tail) {
Pointer.next = null;
Tail = Pointer;
reset();
} else
Pointer.next = cur.next;
Length--;
}
return temp;
}
/** 返回當前結(jié)點的指針 */
private Node cursor() {
if (Head == null)
throw new java.lang.NullPointerException();
else if (Pointer == null)
return Head;
else
return Pointer.next;
}
/** 鏈表的簡單應用舉例 */
public static void main(String[] args) {
List a = new List();
for (int i = 1; i = 10; i++)
a.insert(new Integer(i));
System.out.println(a.currentNode());
while (!a.isEnd())
System.out.println(a.nextNode());
a.reset();
while (!a.isEnd()) {
a.remove();
}
a.remove();
a.reset();
if (a.isEmpty())
System.out.println("There is no Node in List \n");
System.out.println("You can press return to quit\n");
try {
// 確保用戶看清程序運行結(jié)果
System.in.read();
} catch (IOException e) {
}
}
}
// 構(gòu)成鏈表的結(jié)點定義
class Node {
Object data;
Node next;
Node(Object d) {
data = d;
next = null;
}
}
鏈表是一種重要的數(shù)據(jù)結(jié)構(gòu),在程序設(shè)計中占有很重要的地位。C語言和C++語言中是用指針來實現(xiàn)鏈表結(jié)構(gòu)的,由于Java語言不提供指針,所以有人認為在Java語言中不能實現(xiàn)鏈表,其實不然,Java語言比C和C++更容易實現(xiàn)鏈表結(jié)構(gòu)。Java語言中的對象引用實際上是一個指針(本文中的指針均為概念上的意義,而非語言提供的數(shù)據(jù)類型),所以我們可以編寫這樣的類來實現(xiàn)鏈表中的結(jié)點。
class Node
{
Object data;
Node next;//指向下一個結(jié)點
}
將數(shù)據(jù)域定義成Object類是因為Object類是廣義超類,任何類對象都可以給其賦值,增加了代碼的通用性。為了使鏈表可以被訪問還需要定義一個表頭,表頭必須包含指向第一個結(jié)點的指針和指向當前結(jié)點的指針。為了便于在鏈表尾部增加結(jié)點,還可以增加一指向鏈表尾部的指針,另外還可以用一個域來表示鏈表的大小,當調(diào)用者想得到鏈表的大小時,不必遍歷整個鏈表。下圖是這種鏈表的示意圖:
鏈表的數(shù)據(jù)結(jié)構(gòu)
我們可以用類List來實現(xiàn)鏈表結(jié)構(gòu),用變量Head、Tail、Length、Pointer來實現(xiàn)表頭。存儲當前結(jié)點的指針時有一定的技巧,Pointer并非存儲指向當前結(jié)點的指針,而是存儲指向它的前趨結(jié)點的指針,當其值為null時表示當前結(jié)點是第一個結(jié)點。那么為什么要這樣做呢?這是因為當刪除當前結(jié)點后仍需保證剩下的結(jié)點構(gòu)成鏈表,如果Pointer指向當前結(jié)點,則會給操作帶來很大困難。那么如何得到當前結(jié)點呢,我們定義了一個方法cursor(),返回值是指向當前結(jié)點的指針。類List還定義了一些方法來實現(xiàn)對鏈表的基本操作,通過運用這些基本操作我們可以對鏈表進行各種操作。例如reset()方法使第一個結(jié)點成為當前結(jié)點。insert(Object d)方法在當前結(jié)點前插入一個結(jié)點,并使其成為當前結(jié)點。remove()方法刪除當前結(jié)點同時返回其內(nèi)容,并使其后繼結(jié)點成為當前結(jié)點,如果刪除的是最后一個結(jié)點,則第一個結(jié)點變?yōu)楫斍敖Y(jié)點。
鏈表類List的源代碼如下:
import java.io.*;
public class List
{
/*用變量來實現(xiàn)表頭*/
private Node Head=null;
private Node Tail=null;
private Node Pointer=null;
private int Length=0;
public void deleteAll()
/*清空整個鏈表*/
{
Head=null;
Tail=null;
Pointer=null;
Length=0;
}
public void reset()
/*鏈表復位,使第一個結(jié)點成為當前結(jié)點*/
{
Pointer=null;
}
public boolean isEmpty()
/*判斷鏈表是否為空*/
{
return(Length==0);
}
public boolean isEnd()
/*判斷當前結(jié)點是否為最后一個結(jié)點*/
{
if(Length==0)
throw new java.lang.NullPointerException();
else if(Length==1)
return true;
else
return(cursor()==Tail);
}
public Object nextNode()
/*返回當前結(jié)點的下一個結(jié)點的值,并使其成為當前結(jié)點*/
{
if(Length==1)
throw new java.util.NoSuchElementException();
else if(Length==0)
throw new java.lang.NullPointerException();
else
{
Node temp=cursor();
Pointer=temp;
if(temp!=Tail)
return(temp.next.data);
else
throw new java.util.NoSuchElementException();
}
}
public Object currentNode()
/*返回當前結(jié)點的值*/
{
Node temp=cursor();
return temp.data;
}
public void insert(Object d)
/*在當前結(jié)點前插入一個結(jié)點,并使其成為當前結(jié)點*/
{
Node e=new Node(d);
if(Length==0)
{
Tail=e;
Head=e;
}
else
{
Node temp=cursor();
e.next=temp;
if(Pointer==null)
Head=e;
else
Pointer.next=e;
}
Length++;
}
public int size()
/*返回鏈表的大小*/
{
return (Length);
}
public Object remove()
/*將當前結(jié)點移出鏈表,下一個結(jié)點成為當前結(jié)點,如果移出的結(jié)點是最后一個結(jié)點,則第一個結(jié)點成為當前結(jié)點*/
{
Object temp;
if(Length==0)
throw new java.util.NoSuchElementException();
else if(Length==1)
{
temp=Head.data;
deleteAll();
}
else
{
Node cur=cursor();
temp=cur.data;
if(cur==Head)
Head=cur.next;
else if(cur==Tail)
{
Pointer.next=null;
Tail=Pointer;
reset();
}
else
Pointer.next=cur.next;
Length--;
}
return temp;
}
private Node cursor()
/*返回當前結(jié)點的指針*/
{
if(Head==null)
throw new java.lang.NullPointerException();
else if(Pointer==null)
return Head;
else
return Pointer.next;
}
public static void main(String[] args)
/*鏈表的簡單應用舉例*/
{
List a=new List ();
for(int i=1;i=10;i++)
a.insert(new Integer(i));
System.out.println(a.currentNode());
while(!a.isEnd())
System.out.println(a.nextNode());
a.reset();
while(!a.isEnd())
{
a.remove();
}
a.remove();
a.reset();
if(a.isEmpty())
System.out.println("There is no Node in List \n");
System.in.println("You can press return to quit\n");
try
{
System.in.read();
//確保用戶看清程序運行結(jié)果
}
catch(IOException e)
{}
}
}
class Node
/*構(gòu)成鏈表的結(jié)點定義*/
{
Object data;
Node next;
Node(Object d)
{
data=d;
next=null;
}
}
讀者還可以根據(jù)實際需要定義新的方法來對鏈表進行操作。雙向鏈表可以用類似的方法實現(xiàn)只是結(jié)點的類增加了一個指向前趨結(jié)點的指針。
可以用這樣的代碼來實現(xiàn):
class Node
{
Object data;
Node next;
Node previous;
Node(Object d)
{
data=d;
next=null;
previous=null;
}
}
當然,雙向鏈表基本操作的實現(xiàn)略有不同。鏈表和雙向鏈表的實現(xiàn)方法,也可以用在堆棧和隊列的實現(xiàn)中,這里就不再多寫了,有興趣的讀者可以將List類的代碼稍加改動即可。
希望對你有幫助。
src后面是js文件
JSP中,用%=%
script type="text/javascript" src="%=jsPath%"/script
如果只是要寫JS中的一個函數(shù),那
script type="text/javascript"
function test(){
}
/script