Java リストで重複を見つける 4 つの方法
出典: Codippa この記事では、リスト内の重複を検索するさまざまな方法について説明します。複数回出現する要素を重複要素と呼びます。1. セットの使用
以下は、 Setを使用してJava List内の重複要素を検索するアルゴリズムです。- 新しい Java Setオブジェクトと新しいArrayListを作成して、重複した要素を保存します。
- リストに対して反復またはループを実行します。
- add()メソッドを使用して、リスト内の各要素をSetに追加します。
- その結果、add() は、要素が追加された場合はtrueを返し、要素がSetにすでに存在していた場合はfalse を返します。
- 要素がすでにSet内にある場合、それは重複です。次に、それをArrayListに追加します。
- 反復の最後に、新しいArrayListには、元の List ( List ) の重複要素がすべて含まれます。
List<Integer> numbers = List.of(1, 2, 3, 4, 3, 1, 2);
Set<Integer> set = new HashSet<>();
List<Object> duplicates = new ArrayList<>();
numbers.forEach(n -> {
if (!set.add(n)) {
duplicates.add(n);
}
});
System.out.println("Duplicate elements: " + duplicates);
結論:
重複要素: [3, 1, 2]
Listを反復処理するためにforEach()メソッドを使用しましたが、他のメソッドも使用できることに 注意してください。
2. 地図の使い方
以下は、 List内の重複を見つけるこの方法のアルゴリズムの手順です。- 新しいMapオブジェクトと新しいArrayListを作成して、重複した要素を保持します。
- このMapのキーは元のListの要素になり、その値はList内での要素の出現数になります。
- リストをループします ( List )。
- List内の各要素について、 containsKey()メソッドを使用して、その要素がMap内にキーとして存在するかどうかを確認します。
- 存在する場合は、Map内のその値をインクリメントし、 put()メソッドを使用して再度追加します。
- 存在しない場合は、値 1 を指定してマップに追加します。
- リストの反復が完了すると、 1 より大きい値を持つすべてのMap要素が重複になります。
- 最後に、マップを繰り返し、値が 1 より大きい要素をリストに追加して、重複した要素を保存します。
List<Integer> numbers = List.of(1, 2, 3, 4, 3, 1, 2);
Map<Integer, Integer> countMap = new HashMap<>();
List<Object> duplicates = new ArrayList<>();
numbers.forEach(n -> {
if (countMap.containsKey(n)) {
countMap.put(n, countMap.get(n) + 1);
} else {
countMap.put(n, 1);
}
});
countMap.keySet().forEach(k -> {
if(countMap.get(k)> 1) {
duplicates.add(k);
}
});
3. ネストされたループの使用
SetやMapなどのCollectionクラスを使用せずにリスト内の重複要素を検索するように求められた場合、このメソッドが役に立ちます。アルゴリズムの段階:- リストをループします ( List )。
- ループが初めて完了したら、最初に戻って手順を再度繰り返し、リストの残りの各項目を見つけます。
- 現在のループ要素が残りの要素のいずれかと等しい場合、それは重複です。
List<Integer> numbers = List.of(1, 2, 3, 4, 3, 1, 2);
List<Object> duplicates = new ArrayList<>();
for (int i = 0; i < numbers.size() - 1; i++) {
for (int j = i + 1; j < numbers.size(); j++) {
if (numbers.get(i).equals(numbers.get(j))) {
duplicates.add(numbers.get(i));
}
}
}
4. Javaストリームの使用
このメソッドは Java 8 スレッドに基づいており、次のように動作します。- リストをストリームに変換します。
- collect()メソッドを使用してストリームをMapに変換します。たとえば、キーはリスト内の各要素であり、値は出現回数です。
- collect()メソッドが戻り、Map は引数としてCollectorを受け取ります。Collector実装は、結果として得られるMapのキーと値を決定します。
- Map のキーをList の要素にし、その値をその出現数にしたいので、 Collectors.groupingBy()を使用してコレクターを作成できます。
- groupingBy()を使用してMapを作成したら、entrySet()メソッドを使用してMap.Entryオブジェクトのセットを取得します。
- 1 より大きい値 (つまり、出現回数) に基づいてレコードをフィルターします。
- フィルタリングされたレコードをキーと照合します。
List<Integer> numbers = List.of(1, 2, 3, 4, 3, 1, 2);
Map<Object, Long> map = numbers.
stream().
collect(
Collectors.
groupingBy(n -> n, Collectors.counting())
);
List<Object> duplicates = map.
entrySet().
stream().
filter(e -> e.getValue() > 1).
map(e -> e.getKey()).
collect(Collectors.toList());
groupingBy() メソッドは、特定の基準に基づいてコレクション内の項目をグループ化するために使用されます。このメソッドがどのように機能するかの例を次に示します。
- groupingBy() は関数インターフェイスであるFunction引数を取るため、基準はラムダ式として提供されます。
- この場合、恒等関数n -> nによってグループ化します。これは、リスト要素を値によってグループ化することを意味します。
- groupingBy() の2 番目の引数は、各グループ内の要素をどのように組み合わせるかを指定する別のコレクターです。
- ここでは、 Collectors.counting()を使用して、リスト内の各要素の数を含むマップを作成します。
Java を使用して単純なメディア プレーヤーを作成する方法
出典: Medium このチュートリアルは、オーディオ ファイルとビデオ ファイルを再生するためのシンプルなメディア プレーヤーを Java で作成するのに役立ちます。 メディア プレーヤーの開発は、Java の組み込みライブラリを使用してメディア ファイルを操作する方法を学ぶのに最適な方法です。このタスクを実行するには、JavaFX と Java 用のグラフィカル ユーザー インターフェイス (GUI) ツールキットを使用します。ステップ 1: プロジェクトのセットアップ
まず、Java プロジェクトを設定する必要があります。IDE として Eclipse を使用しますが、任意の IDE を使用できます。新しい Java プロジェクトを作成し、「MediaPlayer」という名前を付けます。JavaFX ライブラリをプロジェクトに追加する必要もあります。これを行うには、プロジェクトのプロパティに移動し、JavaFX ライブラリをプロジェクトのビルド パスに追加します。ステップ 2: ユーザー インターフェイスを作成する
次に、メディア プレーヤーのユーザー インターフェイスを作成します。これは、再生ボタン、停止ボタン、および再生したいビデオまたはオーディオ ファイルを表示するメディア プレーヤー パネルを備えたシンプルなユーザー インターフェイスになります。私たちのインターフェースには、 BorderPane レイアウトを使用します。メディア プレーヤー パネルは BorderPane の中央にあり、再生ボタンと停止ボタンは BorderPane の下部にあります。UI コードは次のとおりです。import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.BorderPane;
import javafx.scene.media.Media;
import javafx.scene.media.MediaPlayer;
import javafx.scene.media.MediaView;
import javafx.stage.Stage;
public class MediaPlayerApp extends Application {
private MediaPlayer mediaPlayer;
@Override
public void start(Stage primaryStage) throws Exception {
primaryStage.setTitle("Media Player");
Button playButton = new Button("Play");
playButton.setOnAction(e -> mediaPlayer.play());
Button stopButton = new Button("Stop");
stopButton.setOnAction(e -> mediaPlayer.stop());
BorderPane borderPane = new BorderPane();
Media media = new Media("http://www.example.com/sample.mp4");
mediaPlayer = new MediaPlayer(media);
MediaView mediaView = new MediaView(mediaPlayer);
borderPane.setCenter(mediaView);
borderPane.setBottom(stopButton);
borderPane.setRight(playButton);
Scene scene = new Scene(borderPane, 600, 400);
primaryStage.setScene(scene);
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
このコードでは、playButtonとstopButton という2 つのボタンを作成します。再生ボタンがクリックされると、mediaPlayerオブジェクトのplay()メソッドが呼び出されます。停止ボタンがクリックされると、mediaPlayerオブジェクトのstop()メソッドが呼び出されます。また、サンプル ビデオ ファイルの URL を使用してMediaオブジェクトを作成し、 Mediaオブジェクトを使用してmediaPlayerオブジェクトを作成します。最後に、 MediaPlayerオブジェクトを使用してMediaViewオブジェクトを作成し、それをBorderPane の中心として設定します。
GO TO FULL VERSION