在最近的工作中,遇到了乙個特殊的需求:我們需要乙個佇列來存放某資料物件,但是這個物件的數量是巨大的,如果將這些物件都存入佇列的話,很顯然記憶體會爆表,但是這些物件有乙個特徵是,相同的資料物件型別的資料是可更新的。換句話說,對於同一類資料物件,後面來的物件的值一定比前面的新,是可以完全覆蓋前面的。所以如果物件是可更新的,我們可以通過重寫物件的hashcode和equals方法,然後放在set集合中進行儲存。但是我們還需要此資料結構能儲存佇列的fifo特性,這時候該怎麼辦呢?所以在這裡,我們需要能夠自定義乙個具有set屬性的queue。
在講述具有set屬性的queue之前,我們先來看乙個初級版本的setqueue:具有去重屬性的佇列(此處不需要更新物件,當佇列中新增了相同物件的時候)。
要想實現這個功能需求的queue,過程並不複雜,我們只需額外queue做一層包裝,新增額外的set物件來記錄當前已新增的物件,然後利用此set做去重判斷。
此queue的類變數定義如下:
/**
* thread unsafe implementation of uniquequeue.
*/public class
uniquequeue
implements
queue
else
} finally
}
poll方法實現**如下:
@override
public t poll()
return t;
} finally
}
通過以上的實現,我們就實現了乙個帶有去重屬性的queue。大家可以自行對此queue進行測試,自定義的新增物件是需要過載比較方法的,否則會被認為是不同物件,這一點需要注意。uniquequeue的全部實現**在文章末尾鏈結中將會給出。
基於上部分uniquequeue,下面我們來看對此的乙個擴充套件:queue不僅僅需要是去重的,而且它需要是可更新的。這個需求在很多應用場景中會碰到,比如說實時展示商品銷售資訊。按照往常的做法,我們的做法是定期的獲取商品銷售資訊並進行展示,但是如果說商品資訊的量在非常大的情況下時,怎麼辦,如果一次性沒法更新完畢,下一週期的資料又來了,這又會增加新的壓力。在這種情況下,可更新佇列可以巧妙地幫我們解決這個問題。
首先是此佇列結構的定義:
/**
* the queue is unique and meanwhile can be updated
*/public
class updatedqueue implements queue finally
}@override
public boolean isempty() finally
return isempty;
}...
}
上述類只是乙個基礎類,去重佇列的核心操作我們可以實現在子類實現中,後面大家可以再進一步地對此進行抽象化。我新建了乙個ballupdatedqueue的實現子類,以及相應的實體類ball。
ball物件代表的意思是乙個球,它具有如下屬性,其中球類名稱作為唯一區別符:
public
class
ball
/*** 球資訊更新操作
*@param newball
*/public
void
valueupdated(ball newball)
public string getuniquekey()
@override
public string tostring()
}
然後是可更新佇列的實現:
public
class ballupdatedqueue extends updatedqueue else
} finally
return
true;
}@override
public ball poll()
} finally
return ball;
}}
在上述**中已經進行了詳細的注釋,這裡就不進行過多的解釋了,這裡的乙個核心點在於利用了hashmap進行去重更新的處理。
下面是相應的測試方法:
public
class testupdatedqueue
}
本地測試輸出的結果如下:
the total ball number: 3
the total ball number: 3
ball [ballname=football, price=30, numsale=10]
[1]. c 屬性中的get和set屬性
get是給屬性賦值,set是取屬性的值。get set用法 一是隱藏元件或類內部的真是成員 二是用來建立約束的,比如,實現 有我沒你 這種約束 三是用來響應屬性變化事件,當屬性變化是做某事,只要寫在set方法裡就行。當你想讀出或寫入屬性的值時,訪問標誌限定了被實現的語句。用於讀出屬性的值的訪問標誌記...
C 屬性的get與set
屬性的存在是為了保護與之相對應的字段的,保證欄位的讀取和賦值符合要求。而且要注意的一點是允許外部訪問的變數一定要生命為屬性。屬性可以分為三種 讀寫 唯讀 只寫。讀寫 既有get也有set,外部可以對內部的字段進行賦值,再通過get進行返回,再通過外部進行對結果的顯示,但是在通過外部顯示的時候可以顯示...
css中具有繼承性的屬性
css中具有繼承性的屬性 color eee font font style font variant font weight bold font size font family font stretch font size adjust visibility visible hidden col...