Java 목록에서 중복 항목을 찾는 4가지 방법
출처: Codippa 이 문서에서는 목록에서 중복 항목을 찾는 다양한 방법을 다룹니다. 두 번 이상 나타나는 중복 요소를 호출합니다.1. 세트 사용
다음은 Set 을 사용하여 Java 목록 에서 중복 요소를 찾는 알고리즘입니다 .- 중복 요소를 저장하기 위해 새로운 Java Set 객체 와 새로운 ArrayList를 생성합니다.
- 목록을 통해 반복 또는 루프를 수행합니다.
- add() 메소드를 사용하여 목록의 각 요소를 Set 에 추가합니다 .
- 결과적으로 add()는 요소가 추가된 경우 true를 반환 하고 해당 요소가 Set 에 이미 있는 경우 false를 반환합니다 .
- 요소가 이미 Set 에 있으면 중복된 것입니다. 그런 다음 ArrayList 에 추가합니다 .
- 반복이 끝나면 새 ArrayList 에는 원래 목록( 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 의 각 요소에 대해 containKey() 메서드를 사용하여 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 8 스레드를 기반으로 하며 다음과 같이 작동합니다.- 목록을 스트림 으로 변환합니다 .
- Collect() 메서드를 사용하여 스트림을 Map 으로 변환합니다 . 예를 들어, 키는 목록 의 각 요소이고 값은 발생 횟수 입니다 .
- Collect() 메소드는 반환하고 Map은 Collector를 인수로 사용합니다 . Collector 구현은 결과 Map 의 키와 값을 결정합니다 .
- Map의 키가 List의 요소가 되고 그 값이 해당 항목의 발생 횟수가 되기를 원하므로 Collectors.groupingBy()를 사용하여 Collector를 생성할 수 있습니다 .
- groupingBy() 를 사용하여 지도를 만든 후에는 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()의 두 번째 인수는 각 그룹의 요소를 결합하는 방법을 지정하는 또 다른 수집기입니다.
- 여기서는 목록의 각 요소 수를 포함하는 맵을 생성하는 Collectors.counting()을 사용합니다 .
Java를 사용하여 간단한 미디어 플레이어를 만드는 방법
출처: 중간 이 튜토리얼은 오디오 및 비디오 파일을 재생하기 위해 Java로 간단한 미디어 플레이어를 만드는 데 도움이 됩니다. 미디어 플레이어를 개발하는 것은 Java의 내장 라이브러리를 사용하여 미디어 파일 작업을 수행하는 방법을 배울 수 있는 좋은 방법이 될 수 있습니다. 이 작업을 수행하기 위해 JavaFX 및 Java용 그래픽 사용자 인터페이스(GUI) 툴킷을 사용합니다.1단계: 프로젝트 설정
먼저 Java 프로젝트를 설정해야 합니다. 우리는 Eclipse를 IDE로 사용할 것이지만 원하는 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 이라는 두 개의 버튼을 만듭니다 . 재생 버튼을 클릭하면 mediaPlayer 객체 의 play() 메서드를 호출합니다 . 중지 버튼을 클릭하면 mediaPlayer 개체 의 stop() 메서드를 호출합니다 . 또한 예제 비디오 파일의 URL을 사용하여 Media 객체를 생성하고 Media 객체를 사용하여 mediaPlayer 객체를 생성합니다 . 마지막으로 MediaPlayer 객체 로 MediaView 객체를 생성 하고 이를 BorderPane의 중심으로 설정합니다 .
GO TO FULL VERSION