ตามข้อตกลงเมื่อใช้การเขียนโปรแกรม Java คุณควรใช้คลาสไลบรารีที่มีอยู่ให้มากที่สุด แน่นอนว่าคุณสามารถเขียนวิธีการเรียงลำดับหรือเฟรมเวิร์กได้ด้วยตัวเอง แต่มีกี่คนที่เขียนได้ดีกว่า JDK ข้อดีอีกประการของการใช้คลาสที่มีอยู่ก็คือโค้ดนั้นง่ายต่อการอ่านและบำรุงรักษา บทความนี้จะกล่าวถึงวิธีการใช้คลาสไลบรารีที่มีอยู่เพื่อจัดเรียงอาร์เรย์และคอนเทนเนอร์คอลเลกชันต่างๆ เป็นหลัก (ตัวอย่างบางส่วนในบทความมาจาก "Java Developers Almanac 1.4》 )
ก่อนอื่น คุณต้องรู้สองคลาส: java.util.Arrays และ java.util.Collections (โปรดสังเกตความแตกต่างกับ Collection) Collection เป็นอินเทอร์เฟซระดับบนสุดของกรอบงานการรวบรวม และ Collections มีวิธีการแบบสแตติกมากมาย เราใช้ Arrays เพื่อจัดเรียงอาร์เรย์และ Collections เพื่อจัดเรียงคอนเทนเนอร์เฟรมแบบรวม เช่น ArraysList, LinkedList เป็นต้น
จะต้องเพิ่มการนำเข้า java.util.* และโค้ดเชลล์อื่นๆ เช่น คลาสและวิธีการหลักแบบคงที่ลงในตัวอย่าง ฉันจะเขียนโค้ดทั้งหมดในตัวอย่างแรก และจะละเว้นโค้ดเหล่านั้นโดยไม่มีข้อยกเว้นในตัวอย่างต่อไปนี้
จัดเรียงอาร์เรย์
ตัวอย่างเช่น มีอาร์เรย์ของจำนวนเต็ม:
คัดลอกรหัสรหัสดังต่อไปนี้:
int[] intArray = ใหม่ int[] {4, 1, 3, -23};
เราจะจัดเรียงมันอย่างไร? คุณกำลังคิดถึงอัลกอริธึมการเรียงลำดับด่วนในขณะนี้หรือไม่? ดูวิธีการดำเนินการนี้:
คัดลอกรหัสรหัสดังต่อไปนี้:
นำเข้า java.util.*;
การเรียงลำดับคลาสสาธารณะ{
โมฆะคงที่สาธารณะ main (String [] args) {
int[] intArray = ใหม่ int[] {4, 1, 3, -23};
Arrays.sort(intArray);
-
-
ด้วยวิธีนี้ เราใช้วิธีการคงที่ sort() ของ Arrays เพื่อจัดเรียง intArray ตามลำดับจากน้อยไปมาก และตอนนี้อาร์เรย์ก็กลายเป็น {-23,1,3,4}
หากเป็นอาร์เรย์อักขระ:
คัดลอกรหัสรหัสดังต่อไปนี้:
สตริง [] strArray = สตริงใหม่ [] {"z", "a", "C"};
เราใช้:
คัดลอกรหัสรหัสดังต่อไปนี้:
Arrays.sort(strArray);
ผลลัพธ์หลังจากการเรียงลำดับคือ {C, a, z} และ sort() จะเรียงลำดับจากน้อยไปมากตามลำดับตามธรรมชาติขององค์ประกอบ หากคุณต้องการคำนึงถึงขนาดตัวพิมพ์ คุณสามารถเขียน:
คัดลอกรหัสรหัสดังต่อไปนี้:
Arrays.sort(strArray, String.CASE_INSENSITIVE_ORDER);
แน่นอน เรายังสามารถระบุส่วนของอาร์เรย์ที่จะเรียงลำดับได้ ตัวอย่างเช่น หากเราต้องการเรียงลำดับส่วนที่ 0-2 ของอาร์เรย์ (สมมติว่าความยาวของอาร์เรย์มากกว่า 3) และส่วนอื่นๆ ยังคงไม่เปลี่ยนแปลง เราก็ สามารถใช้:
คัดลอกรหัสรหัสดังต่อไปนี้:
Arrays.sort(strArray,0,2);
ด้วยวิธีนี้ เราจะจัดเรียงเฉพาะองค์ประกอบสามรายการแรกเท่านั้นโดยไม่กระทบต่อส่วนต่อไปนี้
แน่นอนว่าบางคนคงคิดว่าจะเรียงลำดับจากมากไปน้อยอย่างไร? ในบรรดาวิธีการเรียงลำดับหลายวิธี หนึ่งสำเนาของโค้ดจะเป็นดังนี้:
sort(T[] a, ตัวเปรียบเทียบ<? super T> c)
เราสามารถใช้ Comparator เพื่อรับตัวเปรียบเทียบในลำดับย้อนกลับได้ เราจะอธิบาย intArray[] ก่อนหน้านี้เป็นตัวอย่าง:
คัดลอกรหัสรหัสดังต่อไปนี้:
Arrays.sort(intArray,Comparator.reverseOrder());
ด้วยวิธีนี้ ผลลัพธ์ที่เราได้รับคือ {4,3,1,-23} หากเราไม่ต้องการแก้ไขโค้ดต้นฉบับ เราก็สามารถใช้:
คัดลอกรหัสรหัสดังต่อไปนี้:
Collections.reverse(Arrays.asList(intArray));
รับลำดับย้อนกลับของอาร์เรย์ ผลลัพธ์ก็คือ 4,3,1,-23}
ตอนนี้สถานการณ์เปลี่ยนไปแล้ว อาร์เรย์ของเราไม่ใช่อาร์เรย์ของประเภทข้อมูลดั้งเดิม (ประเภทดั้งเดิม) หรือประเภทสตริงอีกต่อไป แต่เป็นอาร์เรย์ของวัตถุ ไม่ทราบลำดับตามธรรมชาติของอาร์เรย์นี้ ดังนั้นเราจึงจำเป็นต้องใช้อินเทอร์เฟซที่เปรียบเทียบได้สำหรับคลาสนี้ ตัวอย่างเช่น เรามีคลาส Name:
คัดลอกรหัสรหัสดังต่อไปนี้:
ชื่อคลาสนำไปใช้เปรียบเทียบ<ชื่อ>{
สตริงสาธารณะ firstName,lastName;
ชื่อสาธารณะ (สตริงชื่อ, นามสกุลสตริง) {
this.firstName=ชื่อแรก;
this.lastName=นามสกุล;
-
public int comparisonTo (ชื่อ o) { // ใช้อินเทอร์เฟซ
int LastCmp=lastName.compareTo(o.lastName);
กลับ (lastCmp!=0?lastCmp:firstName.compareTo(o.firstName));
-
public String toString(){ //สะดวกสำหรับการทดสอบเอาท์พุต
กลับชื่อ+" "+นามสกุล;
-
-
ด้วยวิธีนี้ เมื่อเราเรียงลำดับอาร์เรย์วัตถุนี้ เราจะเปรียบเทียบนามสกุลก่อน จากนั้นจึงเปรียบเทียบชื่อ จากนั้นรับลำดับของทั้งสองวัตถุ เช่นเดียวกับที่ใช้ใน comparisonTo(Name o) คุณอาจลองใช้โปรแกรมเช่นกัน:
คัดลอกรหัสรหัสดังต่อไปนี้:
นำเข้า java.util.*;
NameSort ระดับสาธารณะ {
โมฆะคงที่สาธารณะ main (String [] args) {
ชื่อ nameArray[] = {
ชื่อใหม่ ("จอห์น", "เลนนอน"),
ชื่อใหม่ ("คาร์ล", "มาร์กซ์"),
ชื่อใหม่ ("เกราโช", "มาร์กซ์"),
ชื่อใหม่ ("ออสการ์", "เกราช์")
-
Arrays.sort(ชื่ออาร์เรย์);
สำหรับ(int i=0;i<nameArray.length;i++){
System.out.println(nameArray[i].toString());
-
-
-
ผลลัพธ์เป็นไปตามที่เราคาดหวัง:
คัดลอกรหัสรหัสดังต่อไปนี้:
ออสการ์ เกราช์
จอห์น เลนนอน
เกราโช มาร์กซ์
คาร์ล มาร์กซ
จัดเรียงเฟรมคอลเลกชัน
หากคุณเข้าใจ Arrays.sort() ในการจัดเรียงอาร์เรย์ การใช้เฟรมเวิร์กการรวบรวมจะคล้ายกัน เพียงแทนที่ Arrays ด้วย Collections โปรดทราบว่า Collections เป็นคลาสและ Collection เป็นอินเทอร์เฟซ แม้ว่าจะมีความแตกต่างเพียง "s" เดียว แต่ความหมายของมันกลับแตกต่างอย่างสิ้นเชิง
สมมติว่ามีรายการเชื่อมโยงดังกล่าว:
คัดลอกรหัสรหัสดังต่อไปนี้:
รายการ LinkedList=รายการ LinkedList ใหม่();
รายการ.เพิ่ม(4);
รายการ.เพิ่ม(34);
รายการ.เพิ่ม(22);
รายการ.เพิ่ม(2);
เราแค่ต้องใช้:
คัดลอกรหัสรหัสดังต่อไปนี้:
Collections.sort (รายการ);
คุณสามารถจัดเรียงองค์ประกอบใน ll จากเล็กไปใหญ่ และผลลัพธ์จะเป็น:
คัดลอกรหัสรหัสดังต่อไปนี้:
[2, 4, 22, 34]
หากองค์ประกอบใน LinkedList เป็นสตริง องค์ประกอบเหล่านั้นก็จะถูกจัดเรียงจากเล็กไปหาใหญ่เช่นเดียวกับประเภทข้อมูลพื้นฐาน
หากคุณต้องการใช้การเรียงลำดับแบบย้อนกลับ กล่าวคือ ตั้งแต่การเรียงลำดับไปจนถึงการเรียงลำดับขนาดเล็ก:
คัดลอกรหัสรหัสดังต่อไปนี้:
Collections.sort(รายการ,Collectons.reverseOrder());
หากองค์ประกอบใน LinkedList เป็นออบเจ็กต์แบบกำหนดเอง คุณสามารถใช้อินเทอร์เฟซที่เปรียบเทียบได้เหมือนกับออบเจ็กต์ Name ด้านบน จากนั้นให้ Collection.sort() จัดเรียงองค์ประกอบเหล่านั้นให้คุณ
หากคุณต้องการจัดเรียงออบเจ็กต์ตามแนวคิดของคุณเอง คุณสามารถใช้โค้ดที่คัดลอกได้ดังนี้:
เรียงลำดับ (รายการ <T> รายการ, ตัวเปรียบเทียบ <? super T> c)
วิธีการนี้ทำการเรียงลำดับ ก่อนที่จะยกตัวอย่าง เราต้องอธิบายการใช้ Comparator และรูปแบบของ Comparable Interface ก่อน:
คัดลอกรหัสรหัสดังต่อไปนี้:
เครื่องมือเปรียบเทียบอินเทอร์เฟซสาธารณะ<T> {
int เปรียบเทียบ(T o1, T o2);
-
ในความเป็นจริง วิธีการเขียนของ int comparison(T o1,T o2) ใน Comparator นั้นคล้ายคลึงกับวิธีการเขียนของวิธีการ comparTo() ใน Comparable ในคลาส Name ข้างต้น การเปรียบเทียบของเราเริ่มต้นจาก LastName นี่คือนิสัยของชาวตะวันตก ในประเทศจีน เราต้องการเริ่มการเปรียบเทียบจาก fristName โดยไม่ต้องแก้ไขโค้ดต้นฉบับ ในขณะนี้ Comparator มีประโยชน์:
คัดลอกรหัสรหัสดังต่อไปนี้:
ตัวเปรียบเทียบสุดท้าย<ชื่อ> FIRST_NAME_ORDER=ตัวเปรียบเทียบใหม่<ชื่อ>() {
เปรียบเทียบ int สาธารณะ (ชื่อ n1 ชื่อ n2) {
int firstCmp=n1.firstName.compareTo(n2.firstName);
กลับ (firstCmp!=0?firstCmp:n1.lastName.compareTo
(n2.ชื่อแรก));
-
-
ด้วยวิธีนี้ ตัวเปรียบเทียบที่กำหนดเองของเรา FIRST_NAME_ORDER จะถูกเขียนขึ้น
แปลงอาร์เรย์ของชื่อในตัวอย่างก่อนหน้านี้ให้เป็นรายการ:
คัดลอกรหัสรหัสดังต่อไปนี้:
รายการ<ชื่อ> list=Arrays.asList(nameArray);
Collections.sort(รายการ,FIRST_NAME_ORDER);
ด้วยวิธีนี้ เราจึงตั้งค่าการเรียงลำดับได้สำเร็จโดยใช้ตัวเปรียบเทียบที่เรากำหนดไว้