Java のマルチセット データ構造

Muhammad Adil 2023年6月20日
  1. Java で Multiset を実装するためのオプション
  2. Java でのマルチセット データ構造の例
  3. Java での Multiset の便利な実装
Java のマルチセット データ構造

マルチセットは、同じ値の複数の要素を格納できるデータ構造です。 C++ では、標準テンプレート ライブラリ (STL) に、要素の挿入、削除、および検索のための便利な操作を提供する multiset 実装が含まれています。

このデータ構造は、コレクション内の要素の頻度をカウントする必要がある場合など、さまざまなアプリケーションで役立ちます。

しかし、Java には C++ STL のようなマルチセット データ構造がありますか? 短い答えはイエスです。

Java で Multiset を実装するためのオプション

Java には、マルチセットを実装するためのいくつかのオプションが用意されています。

  1. Map の使用: Map はキーを値にマップするコレクションであり、マルチセットを実装するための 1つのオプションは、キーが要素であり、値がそれらの頻度である Map を使用することです。 要素を挿入するには、その周波数を増やし、要素を削除するには、その頻度を減らします。
  2. List または Array を使用する: もう 1つのオプションは、List または Array を使用して要素を保存し、ループを使用して各要素の頻度をカウントすることです。 コレクションのサイズが大きい場合、要素の頻度を見つけるのに直線的な時間が必要なため、このアプローチは遅くなる可能性があります。
  3. サードパーティ ライブラリの使用: Google の Guava ライブラリや Apache Commons Collections など、Java のマルチセット実装を提供するいくつかのサードパーティ ライブラリが利用可能です。 これらのライブラリは、C++ STL マルチセットに似た便利な実装を提供し、実装を記述したくない場合に適したオプションです。

したがって、Java には C++ STL のようなマルチセット データ構造がありますが、実装はコア Java ライブラリの一部ではありません。 代わりに、MapListArray、またはサードパーティ ライブラリを使用して、Java でマルチセットを実装する必要があります。

Java でのマルチセット データ構造の例

Map<E, Integer> を使用した Java のマルチセット データ構造の簡単な例を次に示します。

import java.util.HashMap;
import java.util.Map;

public class MapMultiset<E> {
  private Map<E, Integer> map;

  public MapMultiset() {
    map = new HashMap<>();
  }

  public void add(E element) {
    Integer count = map.get(element);
    if (count == null) {
      count = 0;
    }
    map.put(element, count + 1);
  }

  public int count(E element) {
    Integer count = map.get(element);
    return count == null ? 0 : count;
  }

  public void remove(E element) {
    Integer count = map.get(element);
    if (count == null) {
      return;
    }
    if (count == 1) {
      map.remove(element);
    } else {
      map.put(element, count - 1);
    }
  }

  public static void main(String[] args) {
    MapMultiset<String> multiset = new MapMultiset<>();
    multiset.add("apple");
    multiset.add("banana");
    multiset.add("apple");
    multiset.add("orange");

    System.out.println("Frequency of apple: " + multiset.count("apple"));
    System.out.println("Frequency of banana: " + multiset.count("banana"));
    System.out.println("Frequency of orange: " + multiset.count("orange"));

    multiset.remove("apple");
    System.out.println("Frequency of apple after removing one: " + multiset.count("apple"));
  }
}

この例では、Map<E, Integer> を使用してマルチセットを実装します。マップは要素をキーとして、その頻度を値として格納します。

addcount、および remove というメソッドがあり、それぞれ要素をマルチセットに追加し、要素の頻度を見つけ、要素の 1 回の出現を削除することができます。

add メソッドは、要素の現在のカウントをマップから取得し、null の場合は 0 に設定します。 次に、このメソッドはカウントに 1 を追加し、更新されたカウントをマップに保存します。

count メソッドは、マップから要素のカウントを取得して返すか、要素がマップにない場合は 0 を返します。

remove メソッドはマップから要素の数を取得し、null の場合はすぐに戻ります。 カウントが 1 の場合、メソッドは要素をマップから削除します。

このメソッドは、カウントが 1 より大きい場合、更新されたカウントをデクリメントしてマップに格納します。

コードが実行されると、マルチセットにいくつかの要素が追加され、各要素の頻度が検出され、"apple" 要素が 1つ削除され、各要素の頻度が出力されます。

ここをクリック コードを確認します。

Java での Multiset の便利な実装

Java での便利で効率的なマルチセットの実装を探しているとします。 Guava や Apache Commons Collections などのサードパーティ ライブラリを使用することをお勧めします。

これらのライブラリは、要素の挿入、削除、検索のさまざまな操作やその他のユーティリティ メソッドなど、豊富な機能セットを提供します。

著者: Muhammad Adil
Muhammad Adil avatar Muhammad Adil avatar

Muhammad Adil is a seasoned programmer and writer who has experience in various fields. He has been programming for over 5 years and have always loved the thrill of solving complex problems. He has skilled in PHP, Python, C++, Java, JavaScript, Ruby on Rails, AngularJS, ReactJS, HTML5 and CSS3. He enjoys putting his experience and knowledge into words.

Facebook