こんにちは「uni!」です。
今回は、プログラミングにおけるリストという概念の「ちょっと面白い拡張」を
思いつきましたので紹介します。
プログラミングを知らないとこの記事の内容は分からないかもしれませんが、
そこはご容赦を(汗
ということでいきなりですが、今回紹介するソースコードを紹介します。
それがこちら(今回はjava言語で書いてみました)
- import java.util.ArrayList;
- import java.util.Iterator;
- public class LargeDataArrayList<E> extends ArrayList<E> implements Iterator<E>{
- private static final long serialVersionUID = 1L;
- private int itrNum;
- private int removeCount;
- private int finalIndex;
- @Override
- public Iterator<E> iterator() {
- itrNum = 0;
- removeCount = 0;
- finalIndex = size();
- return this;
- }
- @Override
- public boolean hasNext() {
- if(itrNum < finalIndex){
- return true;
- }
- removeRange(itrNum - removeCount, itrNum);
- return false;
- }
- @Override
- public E next() {
- E result = get(itrNum);
- if(0 < removeCount){
- set(itrNum - removeCount, result);
- }
- itrNum++;
- return result;
- }
- @Override
- public void remove() {
- removeCount++;
- }
- }
Listに対してこの拡張をすると、イテレーター構想での複数要素の削除が、
多くの場合高速化されます。
さらにListで管理しているデータ数が多ければ多いほど真価を発揮しますので、
「10万件中1000件以上削除する」場合や「100万件中40件以上削除する」
場合においては、何度もremoveするより
拡張したイテレーター構想を使う方が早くなります。
もちろん、拡張部分を使わず通常の使い方も可能で、速度は変わりません。
良い点を挙げてきましたが、もちろん欠点もあります。
それはイテレーター構想であるが故に
「イテレーター構想で削除等を行っている最中のgetやremoveができない」点です。
それらを行った際の挙動は拡張前と変わってしまいますのでご注意下さい。
ここまで、思いついた「Listの面白い拡張」について紹介してきましたがどうでしたか?
私は「自分の使い易いように拡張を考える」のは楽しいと思います。
他の人の発想を見るのも大好きなので、今回はこの記事を書いてみました。
この記事が皆様を「発想が面白い」と感じさせることができていたらうれしいなと考えつつ、
今回の記事を終えたいと思います。
この記事に目を通して下さった皆様、ありがとうございました。