4 วิธีในการค้นหารายการที่ซ้ำกันในรายการ Java
ที่มา: Codippa บทความนี้ครอบคลุมวิธีการต่างๆ ในการค้นหารายการที่ซ้ำกันในรายการ เราเรียกองค์ประกอบที่ซ้ำกันที่ปรากฏมากกว่าหนึ่งครั้ง
1. การใช้ชุด
ด้านล่างนี้เป็นอัลกอริทึมในการค้นหาองค์ประกอบที่ ซ้ำกันในรายการ Java โดยใช้Set- เราสร้างวัตถุ Java Set ใหม่ และArrayList ใหม่ เพื่อจัดเก็บองค์ประกอบที่ซ้ำกัน
- เราดำเนินการวนซ้ำหรือวนซ้ำรายการ
- เราเพิ่มแต่ละองค์ประกอบในรายการไปยังSetโดยใช้ วิธี add( )
- ผลที่ได้คือadd()จะคืนค่าเป็นจริงหากมีการเพิ่มองค์ประกอบนั้น และ จะ ส่ง คืน ค่าเป็นเท็จหากมีองค์ประกอบนั้นอยู่ในSet อยู่แล้ว
- หากองค์ประกอบมีอยู่แล้วใน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]
โปรดทราบว่าเราใช้ เมธอด forEach() เพื่อวนซ้ำผ่าน Listแต่คุณสามารถใช้วิธีอื่นก็ได้
2. การใช้แผนที่
ด้านล่างนี้เป็นขั้นตอนอัลกอริธึมสำหรับวิธีการค้นหารายการที่ซ้ำกันในรายการ- สร้าง วัตถุ แผนที่ ใหม่ และArrayList ใหม่ เพื่อเก็บองค์ประกอบที่ซ้ำกัน
- คีย์ของแผนที่ นี้ จะเป็นองค์ประกอบของรายการดั้งเดิมและค่าของมันจะเป็นจำนวนครั้งที่เกิดขึ้นในรายการ
- วนซ้ำรายการ ( List )
- สำหรับแต่ละองค์ประกอบในรายการให้ตรวจสอบว่ามีอยู่เป็นคีย์ในแผนที่ หรือ ไม่โดยใช้ เมธอด containsKey()
- หากมีอยู่ ให้เพิ่มค่าในแผนที่และเพิ่มอีกครั้งโดยใช้ เมธอด put ( )
- หากไม่มีอยู่ ให้เพิ่มลงในแผนที่ด้วยค่า 1
- เมื่อการวนซ้ำรายการเสร็จสมบูรณ์ องค์ประกอบแผนที่ ทั้งหมด ที่มีค่ามากกว่า 1 จะกลายเป็นรายการที่ซ้ำกัน
- สุดท้าย วนซ้ำแผนที่และเพิ่มองค์ประกอบที่มีค่ามากกว่า 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 8 และทำงานดังนี้:- แปลงรายการเป็นสตรีม
- แปลงสตรีมเป็นแผนที่โดยใช้ เมธอด collect( ) ตัวอย่างเช่น key คือแต่ละองค์ประกอบในรายการ และ value คือจำนวนครั้งที่เกิดขึ้น
- เมธอด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()ซึ่งสร้างแผนที่ที่มีการนับของแต่ละองค์ประกอบในรายการ
วิธีสร้าง Media Player อย่างง่ายโดยใช้ Java
ที่มา: ปานกลาง บท ช่วยสอนนี้จะช่วยคุณสร้างเครื่องเล่นสื่ออย่างง่ายใน Java เพื่อเล่นไฟล์เสียงและวิดีโอ
ขั้นตอนที่ 1: การตั้งค่าโครงการ
ก่อนอื่น เราต้องตั้งค่าโปรเจ็กต์ Java ของเราก่อน เราจะใช้ Eclipse เป็น IDE แต่คุณสามารถใช้ IDE ใดก็ได้ตามที่คุณต้องการ สร้างโครงการ Java ใหม่และตั้งชื่อว่า "MediaPlayer" เราจะต้องเพิ่มไลบรารี JavaFX ให้กับโปรเจ็กต์ของเราด้วย หากต้องการทำสิ่งนี้ ให้ไปที่คุณสมบัติของโปรเจ็กต์และเพิ่มไลบรารี JavaFX ให้กับพาธการ build ของโปรเจ็กต์ขั้นตอนที่ 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 เมื่อคลิกปุ่มเล่น เราจะเรียก เมธอด play ( ) ของ อ็อบเจ็กต์mediaPlayer เมื่อคลิกปุ่มหยุด เราจะเรียกเมธอด stop ( ) ของ วัตถุmediaPlayer นอกจากนี้เรายังสร้าง ออบเจ็กต์ Mediaด้วย URL ของไฟล์วิดีโอตัวอย่างและ ออบ เจ็ กต์ mediaPlayerด้วย ออบเจ็กต์ Media สุดท้ายนี้ เราสร้างวัตถุ MediaViewด้วย วัตถุ MediaPlayerและตั้งให้เป็นศูนย์กลางของ BorderPane
GO TO FULL VERSION