Javaスタックのクイックガイド
1. 概要
この記事では、java.util.Stackクラスを紹介し、それをどのように利用できるかを見ていきます。
Stackは、オブジェクトのLIFO(後入れ先出し)コレクションを表す一般的なデータ構造であり、一定時間で要素をプッシュ/ポップできます。
2. 作成
デフォルトの引数なしのコンストラクターを使用して、Stackの空のインスタンスを作成することから始めましょう。
@Test
public void whenStackIsCreated_thenItHasSize0() {
Stack intStack = new Stack();
assertEquals(0, intStack.size());
}
これはcreate a Stack with the default capacity of 10.になります。追加された要素の数がStackの合計サイズを超えると、自動的に2倍になります。 ただし、要素を削除してもサイズは縮小しません。
3. 同期
StackはVectorの直接のサブクラスです。これは、similarly to its superclass, it’s asynchronizedimplementation.を意味します
ただし、同期は必ずしも必要ではありません。そのような場合は、ArrayDequeを使用することをお勧めします。
4. 追加中
push()メソッドを使用して、Stackの先頭に要素を追加することから始めましょう。これにより、追加された要素も返されます。
@Test
public void whenElementIsPushed_thenStackSizeIsIncreased() {
Stack intStack = new Stack();
intStack.push(1);
assertEquals(1, intStack.size());
}
push()メソッドを使用すると、addElement(). *T*he only difference is that addElement() returns the result of the operation, instead of the element that was added.を使用した場合と同じ効果があります。
複数の要素を一度に追加することもできます。
@Test
public void whenMultipleElementsArePushed_thenStackSizeisIncreased() {
Stack intStack = new Stack();
List intList = Arrays.asList(1, 2, 3, 4, 5, 6, 7);
boolean result = intStack.addAll(intList);
assertTrue(result);
assertEquals(7, intList.size());
}
5. 検索中
次に、Stackの最後の要素を取得および削除する方法を見てみましょう。
@Test
public void whenElementIsPoppedFromStack_thenSizeChanges() {
Stack intStack = new Stack();
intStack.push(5);
intStack.pop();
assertTrue(intStack.isEmpty());
}
Stackの最後の要素を削除せずに取得することもできます。
@Test
public void whenElementIsPeeked_thenElementIsNotRemoved() {
Stack intStack = new Stack();
intStack.push(5);
intStack.peek();
assertEquals(1, intStack.search(5));
assertEquals(1, intStack.size());
}
6. 要素の検索
6.1. サーチ
Stackを使用すると、要素__を検索して、その上からの距離を取得できます。
@Test
public void whenElementIsOnStack_thenSearchReturnsItsDistanceFromTheTop() {
Stack intStack = new Stack();
intStack.push(5);
assertEquals(1, intStack.search(5));
}
結果は、指定されたObjectのインデックスです。 複数のObjectが存在する場合、最上位に最も近いObjectのインデックスが返されます。 スタックの一番上にあるアイテムは、位置1にあると見なされます。
Objectが見つからない場合、search()は-1を返します。
6.2. 要素のインデックスを取得する
Stack,の要素のインデックスを取得するには、indexOf()メソッドとlastIndexOf()メソッドを使用することもできます。
@Test
public void whenElementIsOnStack_thenIndexOfReturnsItsIndex() {
Stack intStack = new Stack();
intStack.push(5);
int indexOf = intStack.indexOf(5);
assertEquals(0, indexOf);
}
lastIndexOf()は常に、スタックの最上位に最も近い要素のインデックスを検索します。 これはsearch()と非常によく似ていますが、上からの距離ではなく、it returns the indexという重要な違いがあります。
@Test
public void whenMultipleElementsAreOnStack_thenIndexOfReturnsLastElementIndex() {
Stack intStack = new Stack();
intStack.push(5);
intStack.push(5);
intStack.push(5);
int lastIndexOf = intStack.lastIndexOf(5);
assertEquals(2, lastIndexOf);
}
7. 要素を削除する
要素の削除と取得の両方に使用されるpop()操作とは別に、Vectorクラスから継承された複数の操作を使用して要素を削除することもできます。
7.1. 指定された要素の削除
removeElement()メソッドを使用して、指定された要素の最初の出現を削除できます。
@Test
public void whenRemoveElementIsInvoked_thenElementIsRemoved() {
Stack intStack = new Stack();
intStack.push(5);
intStack.push(5);
intStack.removeElement(5);
assertEquals(1, intStack.size());
}
removeElementAt()を使用して、Stack:の指定されたインデックスの下にある要素を削除することもできます。
@Test
public void whenRemoveElementAtIsInvoked_thenElementIsRemoved() {
Stack intStack = new Stack();
intStack.push(5); intStack.push(7);
intStack.removeElementAt(1);
assertEquals(-1, intStack.search(7));
}
7.2. 複数の要素の削除
removeAll() APIを使用してStackから複数の要素を削除する方法を簡単に見てみましょう。これは引数としてCollectionを取り、Stackからすべての一致する要素を削除します。 s:
@Test
public void whenRemoveAllIsInvoked_thenAllElementsFromCollectionAreRemoved() {
Stack intStack = new Stack();
List intList = Arrays.asList(1, 2, 3, 4, 5, 6, 7);
intStack.addAll(intList);
intStack.add(500);
intStack.removeAll(intList);
assertEquals(1, intStack.size());
}
clear()またはremoveAllElements()メソッドを使用して、Stackからすべての要素を削除することもできます。これらの方法はどちらも同じように機能します。
@Test
public void whenRemoveIfIsInvoked_thenAllElementsSatysfyingConditionAreRemoved() {
Stack intStack = new Stack();
List intList = Arrays.asList(1, 2, 3, 4, 5, 6, 7);
intStack.addAll(intList);
intStack.removeIf(element -> element < 6);
assertEquals(2, intStack.size());
}
7.3. フィルタを使用した要素の削除
Stack.から要素を削除するための条件を使用することもできます。引数としてフィルター式を使用して、removeIf()を使用してこれを行う方法を見てみましょう。
@Test
public void whenRemoveIfIsInvoked_thenAllElementsSatysfyingConditionAreRemoved() {
Stack intStack = new Stack();
List intList = Arrays.asList(1, 2, 3, 4, 5, 6, 7);
intStack.addAll(intList);
intStack.removeIf(element -> element < 6);
assertEquals(2, intStack.size());
}
8. 繰り返し
Stackを使用すると、IteratorとListIterator.の両方を使用できます。主な違いは、最初の方法ではStackを一方向にトラバースでき、2番目の方法ではこれを実行できることです。両方向:
@Test
public void whenAnotherStackCreatedWhileTraversingStack_thenStacksAreEqual() {
Stack intStack = new Stack<>();
List intList = Arrays.asList(1, 2, 3, 4, 5, 6, 7);
intStack.addAll(intList);
ListIterator it = intStack.listIterator();
Stack result = new Stack();
while(it.hasNext()) {
result.push(it.next());
}
assertThat(result, equalTo(intStack));
}
Stackによって返されるすべてのIteratorsはフェイルファストです。
9. ストリームAPI
A Stackはコレクションです。つまり、Java 8Streams APIで使用できます。 Using Streams with the Stack is similar to using it with any other Collection:
@Test
public void whenStackIsFiltered_allElementsNotSatisfyingFilterConditionAreDiscarded() {
Stack intStack = new Stack();
List inputIntList = Arrays.asList(1, 2, 3, 4, 5, 6, 7,9,10);
intStack.addAll(inputIntList);
int[] intArray = intStack.stream()
.mapToInt(element -> (int)element)
.filter(element -> element <= 3)
.toArray();
assertEquals(3, intArray.length);
}
10. 概要
このチュートリアルは、JavaStackを理解するためのクイックガイドでした。 このトピックの詳細については、Javadocを参照してください。
そして、いつものように、すべてのコードサンプルはover on Githubで見つけることができます。