สวัสดี! ในช่วงสองสามบทเรียนที่ผ่านมา เรามีความก้าวหน้าอย่างมากในการเรียนรู้ ArrayList อย่างไรก็ตาม ในช่วงเวลานี้ เราดำเนินการเฉพาะการดำเนินการที่ง่ายที่สุดเท่านั้น: การลบ การแทรก และการส่งออกไปยังคอนโซล แน่นอนว่านี่ไม่ใช่จุดสิ้นสุดของรายการปัญหาที่นักพัฒนาต้องเผชิญเมื่อใช้ArrayList จำการบรรยายเกี่ยวกับอาร์เรย์และ คลาส Arrays ได้ ไหม? ได้รับการพัฒนาโดยผู้สร้าง Java โดยเฉพาะเพื่อแก้ไขปัญหาทั่วไปที่โปรแกรมเมอร์พบเมื่อทำงานกับอาร์เรย์ แล้วArrayList ล่ะ ? แน่นอนว่ายังมีรายการงานทั่วไปสำหรับเขาด้วย พวกเขาทั้งหมดถูกนำไปใช้ในชั้นเรียนที่แยกจากกันหรือเราจะต้องเขียนพฤติกรรมที่ต้องการด้วยตนเองในแต่ละครั้ง? แน่นอนว่าคุณไม่จำเป็นต้องเขียนทุกอย่างด้วยตัวเอง การดำเนินการทั่วไปส่วนใหญ่ที่ดำเนินการเมื่อใช้คอลเลกชันใน Java ได้ถูกนำไปใช้แล้วในคอลเลกชันคลาสคงที่พิเศษ
คอลเลกชันใน Java
“Collections” เป็นชื่อทั่วไปสำหรับโครงสร้างข้อมูลต่างๆ ใน Java ข้อมูลสามารถจัดเก็บได้หลายวิธี จนถึงตอนนี้เราได้ศึกษาเฉพาะคลาส ArrayListซึ่งข้อมูลถูกเก็บไว้ในอาร์เรย์ เราจะทำความคุ้นเคยกับคอลเลกชันที่เหลือในภายหลัง ตอนนี้ก็เพียงพอแล้วที่จะเข้าใจว่าคลาส Collections ได้รับการออกแบบมาเพื่อทำงานไม่เพียงกับ ArrayList เท่านั้น แต่ยังรวมถึงคอลเลกชันประเภทอื่น ๆ ใน Java ด้วย (ดังนั้นในความเป็นจริงแล้วชื่อของมัน) ดังนั้นคลาส 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()
และ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);
}
}
บทสรุป:
[Юпитер, Уран, Сатурн, Нептун, Меркурий, Марс, Земля, Венера]
ยังไงก็ตาม เรามักจะพูดถึงการเรียงลำดับ ลำดับขององค์ประกอบ ฯลฯ ในที่นี้ จะเกิดอะไรขึ้นถ้างานของเราตรงกันข้าม? ตัวอย่างเช่น เรากำลังพยายามใช้กลไกลอตเตอรี เราได้เพิ่มตัวเลข 100 ตัวลงในวงล้อ ซึ่งควรจะปรากฏบนหน้าจอทีละตัว ผู้เข้าร่วมคนแรกที่ขีดฆ่าหมายเลขทั้งหมดบนตั๋วจะเป็นผู้ชนะ มันง่ายมากที่จะใช้กลไกดังกล่าวโดยใช้วิธีการshuffle()
:
public class Main {
public static void main(java.lang.String[] args) {
ArrayList<Integer> lottery = new ArrayList<>(100);
for (int i = 1; i <= 100; i++) {
lottery.add(i);//add numbers from 1 to 100 to the drum
}
Collections.shuffle(lottery);//mix
System.out.println("Attention! The first 10 numbers appear from the drum!");
for (int i = 0; i < 10; i++) {
System.out.println(lottery.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
}
}
Exception in thread "main" java.lang.UnsupportedOperationException
at java.util.Collections$UnmodifiableCollection.add(Collections.java:1075)
at 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));// wrong planet order
System.out.println(solarSystem);
Collections.swap(solarSystem, solarSystem.indexOf(mercury), solarSystem.indexOf(neptune));
System.out.println(solarSystem);
}
}
เราส่งรายการของเรา ไปยัง method swap()
รวมถึงดัชนีขององค์ประกอบทั้งสองที่ต้องสลับ โปรดทราบ: วิธีการนี้ใช้ได้กับดัชนีโดยเฉพาะ ไม่ใช่กับลิงก์ ดังนั้นที่นี่เราจำเป็นต้องมีวิธีArrayList.indexOf()
การ บทสรุป:
[Нептун, Венера, Земля, Марс, Юпитер, Сатурн, Уран, Меркурий]
[Меркурий, Венера, Земля, Марс, Юпитер, Сатурн, Уран, Нептун]
สุดท้ายนี้เรามาทำความรู้จักกับวิธีการที่น่าสนใจมากกันดีกว่า - disjoint()
. จะตรวจสอบว่าสองคอลเลกชันมีจุดตัดกันหรือไม่ นั่นคือองค์ประกอบที่เหมือนกันอย่างน้อยหนึ่งองค์ประกอบ ถ้าไม่ก็ส่งคืนtrue
ถ้าใช่ก็ส่งfalse
คืน
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
เขาทำงานประจำและต่ำต้อยให้เรามากมาย ทำให้เรามุ่งความสนใจไปที่สิ่งอื่นได้ อ่านเกี่ยวกับเรื่องนี้ใน เอกสาร ของ Oracleมีวิธีอื่นอยู่ที่นั่น
GO TO FULL VERSION