在 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