Javaスタックのクイックガイド

1。概要

この簡単な記事では、java.util.Stackクラスを紹介し、それをどのように利用できるかを見ていきます。

スタックは、オブジェクトのLIFO(後入れ先出し)コレクションを表す一般的なデータ構造であり、一定時間で要素をプッシュ/ポップできます。

新しい実装では、Dequeインターフェースとその実装を優先する必要がありますDequeは、より完全で一貫性のあるLIFO操作のセットを定義します。ただし、特にレガシーコードでは、Stackクラスを処理する必要がある場合がありますが、それをよりよく理解することが重要ですか。

2.スタックを作成します

デフォルトの引数のないコンストラクターを使用して、Stackの空のインスタンスを作成することから始めましょう。

@Test public void whenStackIsCreated_thenItHasSizeZero() { Stack intStack = new Stack(); assertEquals(0, intStack.size()); }

これにより、デフォルトの容量が10のスタック作成されます追加された要素の数がスタックの合計サイズを超えると、自動的に2倍になります。ただし、要素を削除した後、そのサイズが縮小することはありません。

3.スタックの同期

StackVectorの直接のサブクラスです。これは、そのスーパークラス同様に、同期された実装であることを意味します。

ただし、同期は必ずしも必要ではありません。そのような場合は、ArrayDequeを使用することをお勧めします。

4.スタックに追加します

push()メソッドを使用して、スタックの一番上に要素を追加することから始めましょう。これは、追加された要素も返します。

@Test public void whenElementIsPushed_thenStackSizeIsIncreased() { Stack intStack = new Stack(); intStack.push(1); assertEquals(1, intStack.size()); }

使用プッシュ()メソッドが使用するのと同じ効果持つはaddElementを()。T彼唯一の違いは、あるはaddElement()の代わりに添加した元素の、操作の結果を返します。

複数の要素を一度に追加することもできます。

@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.スタックから取得

次に、スタックの最後の要素を取得および削除する方法を見てみましょう。

@Test public void whenElementIsPoppedFromStack_thenElementIsRemovedAndSizeChanges() { Stack intStack = new Stack(); intStack.push(5); Integer element = intStack.pop(); assertEquals(Integer.valueOf(5), element); assertTrue(intStack.isEmpty()); }

Sタックの最後の要素を削除せずに取得することもできます。

@Test public void whenElementIsPeeked_thenElementIsNotRemovedAndSizeDoesNotChange() { Stack intStack = new Stack(); intStack.push(5); Integer element = intStack.peek(); assertEquals(Integer.valueOf(5), element); assertEquals(1, intStack.search(5)); assertEquals(1, intStack.size()); }

6.スタック内の要素を検索します

6.1。探す

スタックを使用すると、要素を検索できます上からの距離を取得します。

@Test public void whenElementIsOnStack_thenSearchReturnsItsDistanceFromTheTop() { Stack intStack = new Stack(); intStack.push(5); intStack.push(8); assertEquals(2, intStack.search(5)); }

結果は、特定のオブジェクトのインデックスです。複数の要素が存在する場合、その1つのインデックス一番上に最も近いものが返されます。スタックの一番上にあるアイテムは、位置1にあると見なされます。

オブジェクトが見つからない場合、search()は-1を返します。

6.2。要素のインデックスを取得する

Sタックの要素のインデックスを取得するには、indexOf ()メソッドとlastIndexOf()メソッドを使用することもできます。

@Test public void whenElementIsOnStack_thenIndexOfReturnsItsIndex() { Stack intStack = new Stack(); intStack.push(5); int indexOf = intStack.indexOf(5); assertEquals(0, indexOf); }

lastIndexOf()は常にスタックの最上位に最も近いです要素のインデックスを見つけるでしょう。これはsearch()と非常によく似ていますが、上からの距離ではなくインデックスを返すという重要な違いがあります。

@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()を使用して、スタック内の指定されたインデックスの下にある要素を削除することもできます

 @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を使用してスタックから複数の要素を削除する方法を簡単に見てみましょう。これは引数としてコレクションを取り、スタックから一致するすべての要素を削除します。

@Test public void givenElementsOnStack_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()); assertEquals(1, intStack.search(500)); }

clear()またはremoveAllElements()メソッドを使用してスタックからすべての要素削除することもできます。これらの方法はどちらも同じように機能します。

@Test public void whenRemoveAllElementsIsInvoked_thenAllElementsAreRemoved() { Stack intStack = new Stack(); intStack.push(5); intStack.push(7); intStack.removeAllElements(); assertTrue(intStack.isEmpty()); }

7.3。フィルタを使用した要素の削除

スタックから要素を削除するための条件を使用することもできます。引数としてフィルター式を使用して、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 allows us to use both an Iterator and a ListIterator. The main difference is that the first one allows us to traverse Stack in one direction and second allows us to do this in both directions:

@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)); }

All Iterators returned by Stack are fail-fast.

9. Stream API for the Java Stack

Stack is a collection, which means we can use it with Java 8 Streams API. Using Stream 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); List filtered = intStack .stream() .filter(element -> element <= 3) .collect(Collectors.toList()); assertEquals(3, filtered.size()); }

10. Summary

This tutorial is a quick and practical guide to understand this core class in Java – the Stack.

もちろん、Javadocで完全なAPIを調べることができます。

そして、いつものように、すべてのコードサンプルはGitHubで見つけることができます。