具有Set屬性的Queue

2022-05-05 18:24:15 字數 2453 閱讀 7579

在最近的工作中,遇到了乙個特殊的需求:我們需要乙個佇列來存放某資料物件,但是這個物件的數量是巨大的,如果將這些物件都存入佇列的話,很顯然記憶體會爆表,但是這些物件有乙個特徵是,相同的資料物件型別的資料是可更新的。換句話說,對於同一類資料物件,後面來的物件的值一定比前面的新,是可以完全覆蓋前面的。所以如果物件是可更新的,我們可以通過重寫物件的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...