[Java]固定キューの実現構想
3932 ワード
オリジナル作品、転載は出典を明記してください:http://blog.csdn.net/qiujuer/article/details/40298761
プログラムの操作で履歴を保存したり、情報を保存したりする必要がある場合があります.しかし、このデータがメモリの中で無限に増加することを望んでいません.簡単に言えば、配列やチェーンテーブルを使うことですが、無限に成長することを望んでいません.最近の20~30件の記録を保存するだけでokです.多くなったらやめます.
上記のニーズについては,配列やチェーンテーブルを直接一定の方法で操作(満タンになったら1つ目を削除)することで対応するニーズを実現できるかもしれないし,もちろん2次パッケージも可能である.
私の最初の実現方法は以下の通りです.
まず、インタフェースを作成します.
このインタフェースには、List、キュー、およびインスタンス化で使用されるクラスが統合されています.
そして私はこのインタフェースを実現しました
インタフェースを実装するのも比較的簡単で、判断削除を追加するだけでなく、大きな時間を変えて余分なものをポップアップすればOKです.
使用方法も簡単です.
実現機能は実現したが、私という完璧なストーリーのある人にとって心の中にはいつもしこりがある.要素を追加するには addElement()メソッドは、デフォルトのadd()メソッドは使用できません.デフォルトメソッドは、余分なデータを削除することを知りません.もちろん、これもこの実装のショートボードです.この問題を解決するために、Java対Listの実装を確認し、ArrayListと LinkedListの実装により、上記のニーズに対応した使用を発見 ArrayListは、要素を頻繁に削除する必要があるため、使用する場合は不適切です. ArrayListでは、重複コピーの問題が発生します.だから書き直すつもりです LinkedListクラス.
書き直すのはもちろん長い過程ですが、本当に海外の牛に感謝しています. LinkedListの貢献は、巨人の肩に立つのがいいです.書き直した操作は下です.
これで心が楽になりました.ところで、ソースが多いので、リンクをあげます.ソース
いいと思うなら、私のオープンソースプロジェクトを見てみましょう.
Genius-Android
プログラムの操作で履歴を保存したり、情報を保存したりする必要がある場合があります.しかし、このデータがメモリの中で無限に増加することを望んでいません.簡単に言えば、配列やチェーンテーブルを使うことですが、無限に成長することを望んでいません.最近の20~30件の記録を保存するだけでokです.多くなったらやめます.
上記のニーズについては,配列やチェーンテーブルを直接一定の方法で操作(満タンになったら1つ目を削除)することで対応するニーズを実現できるかもしれないし,もちろん2次パッケージも可能である.
私の最初の実現方法は以下の通りです.
まず、インタフェースを作成します.
import java.util.Deque;
import java.util.List;
/**
* Created by QiuJu
* on 2014/9/23.
*/
public interface FixedList<T> extends List<T>, Deque<T>, Cloneable, java.io.Serializable {
/**
*
* ,
*/
T addElement(T addLast);
/**
*
*
* @return
*/
int getMaxSize();
/**
*
*
* @return ,
*/
List<T> setMaxSize(int maxSize);
/**
* List
* @return List
*/
List<T> toList();
}
このインタフェースには、List、キュー、およびインスタンス化で使用されるクラスが統合されています.
そして私はこのインタフェースを実現しました
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
public class FixedLinkedList<T> extends LinkedList<T> implements FixedList<T> {
private transient int maxSize = Integer.MAX_VALUE;
public FixedLinkedList() {
super();
}
public FixedLinkedList(int maxSize) {
super();
this.maxSize = maxSize;
}
@Override
public T addElement(T addLast) {
T head = null;
while (size() >= maxSize) {
head = poll();
}
addLast(addLast);
return head;
}
@Override
public List<T> setMaxSize(int maxSize) {
List<T> list = null;
if (maxSize < this.maxSize) {
list = new ArrayList<T>();
while (size() > maxSize) {
list.add(poll());
}
}
this.maxSize = maxSize;
return list;
}
@Override
public List<T> toList() {
List<T> list = new ArrayList<T>();
list.addAll(this);
return list;
}
@Override
public int getMaxSize() {
return this.maxSize;
}
}
インタフェースを実装するのも比較的簡単で、判断削除を追加するだけでなく、大きな時間を変えて余分なものをポップアップすればOKです.
使用方法も簡単です.
FixedList<String> fixed = new FixedLinkedList<String>(10);
//
fixed.addElement("1");
fixed.addElement("2");
fixed.addElement("3");
fixed.setMaxSize(5);
// List
List<String> fixedList = fixed.toList();
実現機能は実現したが、私という完璧なストーリーのある人にとって心の中にはいつもしこりがある.要素を追加するには addElement()メソッドは、デフォルトのadd()メソッドは使用できません.デフォルトメソッドは、余分なデータを削除することを知りません.もちろん、これもこの実装のショートボードです.この問題を解決するために、Java対Listの実装を確認し、ArrayListと LinkedListの実装により、上記のニーズに対応した使用を発見 ArrayListは、要素を頻繁に削除する必要があるため、使用する場合は不適切です. ArrayListでは、重複コピーの問題が発生します.だから書き直すつもりです LinkedListクラス.
書き直すのはもちろん長い過程ですが、本当に海外の牛に感謝しています. LinkedListの貢献は、巨人の肩に立つのがいいです.書き直した操作は下です.
// ===================FixedList===================
//
// ,
//
// ,
// 5
FixedList<Integer> list = new FixedList<Integer>(5);
//
list.add(1);
// add
list.addLast(1);
// ,
list.addFirst(19);
//
list.addAll(new ArrayList<Integer>());
//
list.getMaxSize();
// ;
list.setMaxSize(3);
// poll
int i = list.poll();
// remove poll , ,
list.remove();
//
list.clear();
// List
List<Integer> list1 = new FixedList<Integer>(2);
list1.add(1);
list1.clear();
は、完全に使用できることを示しています. LinkedListのメソッドで操作するのは、最大容量を取得し、最大容量を設定するメソッドが多く加わっているにすぎない.これで心が楽になりました.ところで、ソースが多いので、リンクをあげます.ソース
いいと思うなら、私のオープンソースプロジェクトを見てみましょう.
Genius-Android