在 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]
请注意,我们使用forEach()方法来迭代List,但您可以使用任何其他方法。
2. 使用地图
以下是这种在List中查找重复项的方法的算法步骤。- 创建一个新的Map对象和一个新的ArrayList来保存重复元素。
- 该Map的键将是原始List的元素,其值将是它们在List中出现的次数。
- 循环遍历列表(List)。
- 对于List中的每个元素,使用containsKey()方法检查它是否作为Map中的键存在。
- 如果存在,则在Map中增加其值,然后使用put()方法再次添加它。
- 如果不存在,则将其添加到Map中,值为1。
- 一旦列表迭代完成,所有值大于 1 的Map元素都会变成重复项。
- 最后,迭代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.使用嵌套循环
如果要求您在不使用任何Collection类(如Set、Map等)的情况下查找列表中的重复元素,那么此方法将很有用。算法阶段:- 循环遍历列表(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。例如,key是列表中的每个元素,value是出现的次数。
- 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() 方法用于根据特定条件对集合中的项目进行分组。以下是此方法如何工作的示例:
- 该标准以 lambda 表达式的形式提供,因为groupingBy()采用Function参数,它是一个函数接口。
- 在本例中,我们按恒等函数n -> n进行分组,这意味着我们按列表元素的值对列表元素进行分组。
- groupingBy() 的第二个参数是另一个收集器,它指定应如何组合每个组中的元素。
- 这里我们使用Collectors.counting()创建一个包含列表中每个元素的计数的Map 。
如何使用 Java 创建简单的媒体播放器
来源:Medium 本教程将帮助您用 Java 创建一个简单的媒体播放器来播放音频和视频文件。 开发媒体播放器是学习如何使用 Java 内置库处理媒体文件的好方法。为了完成此任务,我们将使用 JavaFX 和 Java 图形用户界面 (GUI) 工具包。第 1 步:项目设置
首先,我们需要设置 Java 项目。我们将使用 Eclipse 作为 IDE,但您可以使用您选择的任何 IDE。创建一个新的 Java 项目并将其命名为“MediaPlayer”。我们还需要将 JavaFX 库添加到我们的项目中。为此,请转到项目属性并将 JavaFX 库添加到项目的构建路径中。第 2 步:创建用户界面
接下来我们将为媒体播放器创建用户界面。它将是一个简单的用户界面,带有播放按钮、停止按钮和媒体播放器面板,用于显示我们想要播放的视频或音频文件。对于我们的界面,我们将使用BorderPane 布局。媒体播放器面板将位于 BorderPane 的中心,播放和停止按钮将位于 BorderPane 的底部。这是用户界面代码: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