สวัสดี!
ArrayList
ในบทเรียนสองสามบทที่ผ่าน มาเรามีความก้าวหน้าอย่างมากในการเรียนรู้ อย่างไรก็ตาม จนถึงตอนนี้เราได้ดำเนินการอย่างง่ายที่สุดเท่านั้น: ลบ แทรก และแสดง แน่นอนว่าสิ่งนี้ไม่ครอบคลุมรายการงานทั้งหมดที่นักพัฒนาต้องทำเมื่อทำงานArrayList
กับ จำบทเรียนเกี่ยวกับอาร์เรย์และArrays
คลาสได้หรือไม่? ผู้สร้าง Java ออกแบบคลาสนี้โดยเฉพาะเพื่อจัดการกับงานทั่วไปที่โปรแกรมเมอร์ต้องเผชิญเมื่อทำงานกับอาร์เรย์ และสิ่งที่เกี่ยวกับArrayList
? แน่นอนว่ามีรายการงานทั่วไปที่ต้องดำเนินการด้วย มีการนำไปใช้ในคลาสเฉพาะหรือไม่ หรือเราต้องเขียนการนำไปใช้เองทุกครั้ง แน่นอน คุณไม่จำเป็นต้องเขียนทุกอย่างด้วยตัวเอง การดำเนินการทั่วไปที่เกี่ยวข้องกับคอลเลกชันได้ถูกนำไปใช้แล้วในCollections
คลาส สแตติกพิเศษ ใน Java กลุ่มของโครงสร้างข้อมูลโดยทั่วไปจะเรียกว่าคอลเลกชัน สามารถเก็บข้อมูลได้หลายวิธี จนถึงตอนนี้ เราได้ศึกษาเฉพาะArrayList
คลาสซึ่งข้อมูลถูกเก็บไว้ในอาร์เรย์ เราจะทำความคุ้นเคยกับคอลเลกชันอื่นในภายหลัง สำหรับตอนนี้ ก็เพียงพอแล้วที่จะเข้าใจว่าCollections
ชั้นเรียนได้รับการออกแบบมาให้ใช้งานได้ไม่เพียงเท่านั้นArrayList
แต่ยังรวมถึงคอลเล็กชันประเภทอื่นๆ ด้วย (จึงเป็นชื่อของมัน) ดังนั้นCollections
ชั้นเรียนช่วยงานอะไรได้บ้างเมื่อทำงานกับArrayList
? สิ่งแรกและชัดเจนที่สุดคือการเรียงลำดับ ในบทเรียนเกี่ยวกับอาร์เรย์ เราพิจารณาตัวอย่างที่มีตัวเลข ตอนนี้เราจะพิจารณาตัวอย่างด้วยสตริง คลาสCollections
ใช้sort()
วิธีการเรียงลำดับเนื้อหาของคอลเลกชัน:
public class Main {
public static void main(java.lang.String[] args) {
String mercury = new String("Mercury");
String venus = new String("Venus");
String earth = new String("Earth");
String mars = new String("Mars");
String jupiter = new String("Jupiter");
String saturn = new String("Saturn");
String uranus = new String("Uranus");
String neptune = new String("Neptune");
ArrayList<String> solarSystem = new ArrayList<>(Arrays.asList(mercury, venus, earth, mars,
jupiter, saturn, uranus, neptune));
Collections.sort(solarSystem);
System.out.println(solarSystem);
}
}
ผลลัพธ์: [โลก ดาวพฤหัสบดี ดาวอังคาร ดาวพุธ ดาวเนปจูน ดาวเสาร์ ดาวยูเรนัส ดาวศุกร์] สตริงจะเรียงตามตัวอักษร! แต่ทำไมต้องเรียงตามตัวอักษร? คลาสString
ใช้ตรรกะที่ควบคุมวิธีเปรียบเทียบสตริง (ซึ่งเรียงตามตัวอักษร) สำหรับชั้นเรียนที่คุณสร้างเอง คุณสามารถใช้ตรรกะการเปรียบเทียบของคุณเองได้ แต่เราจะพูดถึงเรื่องนี้ในบทเรียนอื่นๆ คลาส นี้Collections
ยังช่วยคุณค้นหาองค์ประกอบต่ำสุดและสูงสุดในไฟล์ArrayList
. สิ่งนี้ทำได้โดยใช้min()
and max()
วิธีการ:
public static void main(java.lang.String[] args) {
ArrayList<Integer> numbers = new ArrayList<>(Arrays.asList(1,2,3,4,5,6,7));
System.out.println(Collections.max(numbers));
System.out.println(Collections.min(numbers));
}
ผลลัพธ์: 7 1 ตามธรรมชาติแล้ว สิ่งนี้สะดวกกว่าการเขียนโค้ดด้วยตนเองเพื่อวนซ้ำองค์ประกอบทั้งหมดและค้นหาองค์ประกอบที่ใหญ่ที่สุด/เล็กที่สุด :) อีกวิธีที่มีประโยชน์มากreverse()
คือ ถ้าเราต้อง "พลิก" รายการเพื่อให้องค์ประกอบไปในลำดับตรงกันข้าม เราจะทำอย่างไร มันคงไม่ง่ายนักที่จะเขียนอัลกอริทึมด้วยตัวเอง :) โชคดีที่reverse()
วิธีการนั้นรู้วิธีอยู่แล้ว สมมติว่าเราไม่ชอบความจริงที่ว่าsort()
วิธีนี้จัดเรียงดาวเคราะห์ของเราตามตัวอักษร และเราต้องการกลับลำดับจาก Z เป็น A:
public class Main {
public static void main(java.lang.String[] args) {
String mercury = new String("Mercury");
String venus = new String("Venus");
String earth = new String("Earth");
String mars = new String("Mars");
String jupiter = new String("Jupiter");
String saturn = new String("Saturn");
String uranus = new String("Uranus");
String neptune = new String("Neptune");
ArrayList<String> solarSystem = new ArrayList<>(Arrays.asList(mercury, venus, earth, mars,
jupiter, saturn, uranus, neptune));
Collections.sort(solarSystem);
Collections.reverse(solarSystem);
System.out.println(solarSystem);
}
}
ผลลัพธ์: [Venus, Uranus, Saturn, Neptune, Mercury, Mars, Jupiter, Earth] เราได้พูดคุยกันมากมายเกี่ยวกับการจัดเรียง ลำดับขององค์ประกอบ ฯลฯ แต่ถ้าเรามีวัตถุประสงค์ตรงกันข้ามล่ะ ตัวอย่างเช่น สมมติว่าเรากำลังพยายามใช้เกมบิงโก เราเพิ่ม 100 ตัวเลขลงในกลอง ควรปรากฏบนหน้าจอทีละรายการ ผู้เล่นคนแรกที่ขีดฆ่าตัวเลขทั้งหมดบนตั๋วจะเป็นผู้ชนะ ทำได้ง่ายโดยใช้shuffle()
วิธีการ:
public class Main {
public static void main(java.lang.String[] args) {
ArrayList<Integer> bingoDrum = new ArrayList<>(100);
for (int i = 1; i <= 100; i++) {
bingoDrum.add(i);// add the numbers 1 to 100 to the drum
}
Collections.shuffle(bingoDrum);// Mix it up
System.out.println ("Your attention, please! Here are the first 10 numbers from the drum!");
for (int i = 0; i < 10; i++) {
System.out.println(bingoDrum.get(i));
}
}
}
ผลลัพธ์: โปรดทราบ! นี่คือ 10 ตัวเลขแรกจากกลอง! 32 61 4 81 25 8 66 35 42 71 ง่ายขนาดนั้น! ปัญหาได้รับการแก้ไขแล้วและเขียนส่วนของเราในเกม :) ตอนนี้ลองนึกภาพสถานการณ์ที่แตกต่างออกไป ก่อนหน้านี้ เราสร้างsolarSystem
รายการที่มีดาวเคราะห์ และดูเหมือนว่าจะเหมาะกับเราในทุก ๆ ด้าน แต่อย่างหนึ่ง: คุณสามารถลบรายการจากมันและเพิ่มรายการใหม่ ! เห็นได้ชัดว่านี่ไม่ใช่พฤติกรรมที่เราคาดหวัง: ระบบสุริยะไม่ควรเปลี่ยนแปลงในโปรแกรมของเรา ชั้นCollections
เรียนมีวิธีการที่น่าสนใจมาก: unmodifiableList()
. สร้างรายการที่ไม่เปลี่ยนรูปจากรายการที่ส่งผ่านเป็นอาร์กิวเมนต์ คุณไม่สามารถเพิ่มหรือลบรายการจากรายการนี้ได้ เมื่อต้องจัดการกับรายชื่อดาวเคราะห์ในระบบสุริยะ นี่คือสิ่งที่เราต้องการ!
public class Main {
public static void main(java.lang.String[] args) {
String mercury = new String("Mercury");
String venus = new String("Venus");
String earth = new String("Earth");
String mars = new String("Mars");
String jupiter = new String("Jupiter");
String saturn = new String("Saturn");
String uranus = new String("Uranus");
String neptune = new String("Neptune");
List<String> solarSystem = Collections.unmodifiableList(new ArrayList<>(Arrays.asList(mercury, venus, earth, mars,
jupiter, saturn, uranus, neptune)));
solarSystem.add("Pluto");// Try to add a new element
}
}
เอาต์พุต: ข้อยกเว้นในเธรด "main" java.lang.UnsupportedOperationException ที่ java.util.Collections$UnmodifiableCollection.add(Collections.java:1075) ที่ Main.main(Main.java:21) นี่เป็นข้อผิดพลาด: คุณไม่สามารถ เพิ่มอะไรให้solarSystem
! สิ่งเดียวที่คุณต้องให้ความสนใจที่นี่คือข้อเท็จจริงที่ว่าเมธอดนี้ส่งคืนList<>
(ไม่ArrayList<>
) เนื่องจากประเภทนี้เป็นเรื่องปกติสำหรับรายการทุกประเภท อีกสถานการณ์หนึ่งที่เกิดขึ้นได้ง่ายคือโปรแกรมเมอร์เพิ่มองค์ประกอบผิดลำดับ หากสิ่งนี้เกิดขึ้นและเราพบว่าดาวพุธและดาวเนปจูนปะปนกัน เราสามารถแก้ไขข้อผิดพลาดนี้ได้โดยใช้วิธีswap()
:
public class Main {
public static void main(java.lang.String[] args) {
String mercury = new String("Mercury");
String venus = new String("Venus");
String earth = new String("Earth");
String mars = new String("Mars");
String jupiter = new String("Jupiter");
String saturn = new String("Saturn");
String uranus = new String("Uranus");
String neptune = new String("Neptune");
ArrayList<String> solarSystem = new ArrayList<>(Arrays.asList(neptune, venus, earth, mars
, jupiter, saturn, uranus, mercury));// The planets are in the wrong order
System.out.println(solarSystem);
Collections.swap(solarSystem, solarSystem.indexOf(mercury), solarSystem.indexOf(neptune));
System.out.println(solarSystem);
}
}
เราส่งผ่านswap()
รายการของเราและดัชนีขององค์ประกอบทั้งสองที่ต้องสลับไปยังวิธีการ โปรดทราบว่าวิธีนี้ใช้ได้กับดัชนี ไม่ใช่การอ้างอิง ดังนั้นที่นี่เราต้องใช้ArrayList.indexOf()
วิธีการ ผลลัพธ์: [Neptune, Venus, Earth, Mars, Jupiter, Saturn, Uranus, Mercury] [Mercury, Venus, Earth, Mars, Jupiter, Saturn, Uranus, Neptune] ในที่สุด เราจะทำความคุ้นเคยกับวิธีการที่น่าสนใจมาก : disjoint()
. ตรวจสอบว่าคอลเลกชั่นสองคอลเลกชั่นตัดกันหรือไม่ เช่น มีองค์ประกอบที่เหมือนกันอย่างน้อยหนึ่งรายการหรือไม่ ถ้าไม่มีก็จะคืนค่าจริง พวกเขาทำแล้วจะส่งกลับเท็จ
public class Main {
public static void main(java.lang.String[] args) {
String mercury = new String("Mercury");
String venus = new String("Venus");
String earth = new String("Earth");
String mars = new String("Mars");
String jupiter = new String("Jupiter");
String saturn = new String("Saturn");
String uranus = new String("Uranus");
String neptune = new String("Neptune");
ArrayList<String> solarSystemPart1 = new ArrayList<>(Arrays.asList(mercury, venus, earth, mars));
ArrayList<String> solarSystemPart2 = new ArrayList<>(Arrays.asList(jupiter, saturn, uranus, neptune));
System.out.println(Collections.disjoint(solarSystemPart1, solarSystemPart2));
}
}
อย่างที่คุณเห็น ทั้งสองรายการของเรามีองค์ประกอบที่แตกต่างกันโดยสิ้นเชิง ดังนั้นโปรแกรมจึงแสดงผลเป็นtrue นี่เป็นคลาสที่น่าสนใจและมีประโยชน์มาก เช่นArrays
มันทำงานประจำและน่าเบื่อให้เรามากมาย ปล่อยให้เราโฟกัสกับสิ่งอื่น
GO TO FULL VERSION