"Rishi ฉันตั้งตารอที่จะเรียนรู้เกี่ยวกับวิธีการที่เหลือของคลาส Arrays
"ความกระตือรือร้นในการเรียนรู้นั้นไม่สามารถทำให้ครูเก่าของคุณพอใจได้ แต่ถ้าคุณต้องการค้นหาทุกสิ่งจริง ๆ พ่อมดผู้ใจดีชื่อ Google จะช่วยคุณทั้งวันทั้งคืน"
"เอ่อ..."
"ล้อเล่นครับ แน่นอนครับ ผมจะอธิบายทุกอย่างให้ดีขึ้น แต่ถ้ามีอะไรเกิดขึ้น ให้จำพ่อมดที่ดีไว้ ผมจะเริ่มบทเรียนวันนี้ด้วยวิธีArrays.fill
การ
"เมื่อทำงานกับอาร์เรย์ โปรแกรมเมอร์ Java มักจะต้องเติมอาร์เรย์ด้วยค่าเดียวกัน แน่นอนว่าคุณสามารถเขียนลูปและกำหนดค่าให้กับแต่ละเซลล์ของอาร์เรย์ในลูปได้:
int[] x = new int[100];
for (int i = 0; i < x.length; i++)
x[i] = 999;
"หรือแทนที่จะเรียกทั้งหมดนี้ คุณสามารถเรียกใช้Arrays.fill()
เมธอด ซึ่งทำสิ่งเดียวกันทุกประการ: มันเติมอาร์เรย์ที่ส่งผ่านด้วยค่าที่ส่งผ่าน นี่คือลักษณะที่ปรากฏ:
Arrays.fill(name, value)
และโค้ดในตัวอย่างด้านบนสามารถทำให้กระชับและชัดเจนขึ้นอีกเล็กน้อย:
int[] x = new int[100];
Arrays.fill(x, 999);
"สวย!"
"คุณสามารถใช้Arrays.fill()
เมธอดเพื่อเติมอาร์เรย์ทั้งหมด แต่เพียงบางส่วนด้วยค่าบางอย่าง:
Arrays.fill(name, first, last, value)
"ที่แรกและสุดท้ายคือดัชนีของเซลล์แรกและเซลล์สุดท้ายที่จะเติม
" ตามประเพณีเก่าที่ดี (หรือไม่ดี) ของ Java โปรดจำไว้ว่าองค์ประกอบสุดท้ายไม่รวมอยู่ในช่วง
ตัวอย่าง:
|
เรากำลังเติมเซลล์ x[3] , x[4] , x[5] , และด้วยx[6] ค่า 999 เซลล์ของอาร์เรย์มีหมายเลขเริ่มต้นจากศูนย์! ตัวแปร str ประกอบด้วยค่า"[1, 2, 3, 999, 999, 999, 999, 8, 9, 10]" |
" Arrays.fill()
เมธอดใช้ได้กับอาร์เรย์หนึ่งมิติเท่านั้น หากคุณส่งต่ออาร์เรย์สองมิติไปยังเมธอด จะถือว่าเมธอดนั้นเป็นหนึ่งมิติ โดยมีผลที่ตามมาทั้งหมด
Arrays.copyOf()
"Amigo โปรดบอกวิธีเปลี่ยนขนาดของอาร์เรย์หลังจากสร้างแล้ว"
"อืม... นั่นเป็นคำถามหลอกใช่ไหม ฉันไม่ใช่มือใหม่อีกต่อไป คำตอบที่ถูกต้องคือคุณทำไม่ได้! คุณไม่สามารถปรับขนาดอาร์เรย์ได้หลังจากที่สร้างเสร็จแล้ว"
“แต่ถ้าคุณต้องการจริงๆล่ะ?”
“ยังเป็นไปไม่ได้!
"อันที่จริง ถ้าคุณต้องการจริงๆ คุณก็ทำได้! ด้วยความช่วยเหลือของเคล็ดลับการเขียนโปรแกรม:
- ขั้นแรก คุณต้องสร้างอาร์เรย์ใหม่ตามความยาวที่ต้องการ
- จากนั้นคุณคัดลอกองค์ประกอบทั้งหมดจากอาร์เรย์แรกลงไป
"นี่คือสองสิ่งที่Arrays.copyOf()
เมธอดทำ นี่คือสิ่งที่เรียกมันว่า:
Type[] name2 = Arrays.copyOf(name, length);
"วิธีนี้ไม่ได้เปลี่ยนอาร์เรย์ที่มีอยู่แต่สร้างอาร์เรย์ใหม่ แทน และคัดลอกองค์ประกอบของอาร์เรย์เก่าลงไป"
"จะเกิด อะไรขึ้นถ้าความยาวของอาร์เรย์ใหม่น้อยกว่าความยาวของอาร์เรย์ที่มีอยู่
"เป็นคำถามที่ดี Amigo! หากองค์ประกอบไม่เหมาะสม ค่าพิเศษก็จะถูกเพิกเฉย"
"และในทางกลับกัน ถ้ามีเซลล์พิเศษ ค่าเริ่มต้นของพวกมันคืออะไร?
"ถ้าความยาวของอาร์เรย์ใหม่มากกว่าความยาวของอาร์เรย์เก่า เซลล์จะเต็มไปด้วยเลขศูนย์
ตัวอย่าง:
|
ตัวแปร str2 มีค่า ตัวแปรมีค่า"[1, 2, 3, 4, 5]" str3 "[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 0, 0, 0, 0, 0]" |
Arrays.copyOfRange()
"แล้วถ้าคุณต้องการรับอาร์เรย์ที่มีความยาว 5 จากอาร์เรย์ที่มีความยาว 10 แต่คุณต้องการให้องค์ประกอบ 5 ตัวสุดท้ายมากกว่า 5 ตัวแรกล่ะ ในกรณีนี้ คุณต้องการเมธอดอื่นของคลาส มันArrays
คือArrays.copyOfRange()
นี่คือสิ่งที่เรียกว่า:
Type[] name2 = Arrays.copyOfRange(name, first, last);
"วิธีนี้สร้างอาร์เรย์ใหม่ด้วย แต่เติมด้วยองค์ประกอบจากตำแหน่งใดก็ได้ในอาร์เรย์เดิม โดยที่ตัวแรกและตัวสุดท้ายคือดัชนีขององค์ประกอบตัวแรกและตัวสุดท้ายที่ควรใส่ลงในอาร์เรย์ใหม่ คุณช่วยบอกฉันได้ไหมว่า องค์ประกอบสุดท้ายรวมอยู่ในช่วงนี้หรือไม่"
"ฮ่า! ดังที่ครูผู้ยิ่งใหญ่ของฉันเคยพูดว่า ' ตามประเพณีเก่าที่ดี (หรือไม่ดี) ของ Java โปรดจำไว้ว่าองค์ประกอบสุดท้ายไม่รวมอยู่ในช่วง '"
"อามิโก คุณเติบโตต่อหน้าต่อตาเรา
ตัวอย่าง:
|
ตัวแปร str2 มีค่า ตัวแปรมีค่า"[16, 17, 18, 19, 20]" str3 "[16, 17, 18, 19, 20, 0, 0, 0, 0, 0]" |
Arrays.sort()
"และสุดท้าย ฉันได้ทิ้งวิธีที่ดีที่สุด... mmm... ไว้เป็นลำดับสุดท้าย: sortingอาร์เรย์ถูกจัดเรียงค่อนข้างบ่อยในการเขียนโปรแกรม นี่คือการกระทำยอดนิยม 3 อันดับแรกเมื่อทำงานกับอาร์เรย์:
- การเรียงลำดับอาร์เรย์
- การค้นหาองค์ประกอบต่ำสุด (หรือสูงสุด) ของอาร์เรย์
- การกำหนดดัชนีขององค์ประกอบในอาร์เรย์ (การค้นหาองค์ประกอบในอาร์เรย์)
"ฉันต้องบอกว่าอัลกอริธึมการเรียงลำดับที่มีประสิทธิภาพดีนั้นไม่ใช่เรื่องง่ายที่จะเขียน พูดให้ชัดเจนยิ่งขึ้น นี่เป็นงานมาตรฐาน และในฐานะนักเรียน การฝึกเขียนอัลกอริทึมการเรียงลำดับในบางครั้งจะไม่ทำให้คุณเจ็บปวด แต่ที่ทำงาน ดีกว่าที่จะไม่เสียเวลาคิดค้นวงล้อใหม่ ผู้สร้างของ Java รวมวิธีsort()
การไว้ในArrays
คลาส นี่คือสิ่งที่เรียกมันว่า:
Arrays.sort(name);
วิธีนี้จะเรียงลำดับอาร์เรย์ที่ส่งผ่านจากน้อยไปหามาก
ตัวอย่าง:
|
ตัวแปร str ประกอบด้วยค่า"[-20, -20, -20, -2, 0, 3, 8, 11, 99, 999]" |
"เยี่ยมมาก! ฉันเรียกเพียงวิธีเดียวและจัดเรียงอาร์เรย์ สิ่งที่สวยงาม!"
"อย่างไรก็ตาม คุณสามารถจัดเรียงได้ไม่เพียงแค่อาร์เรย์ทั้งหมดเท่านั้น แต่ยังสามารถจัดเรียงเพียงบางส่วนได้ด้วย นี่คือสิ่งที่เรียกมันว่า:
Arrays.sort(name, first, last);
"ที่แรกและสุดท้ายคือดัชนีของเซลล์แรกและเซลล์สุดท้ายที่การเรียงลำดับควรสัมผัส และ...
"ฉันรู้แล้วว่าคุณกำลังจะพูดอะไร! 'ตามประเพณีเก่าที่ดี (หรือไม่ดี) ของ Java โปรดจำไว้ว่าองค์ประกอบสุดท้ายไม่รวมอยู่ในช่วง '
ตัวอย่าง:
|
ตัวแปร str ประกอบด้วยค่า"[11, -2, 3, 0, -20, -20, 8, 999, 99, -20]" |
"ในการจัดเรียงอาร์เรย์ Java ใช้อัลกอริธึมการเรียงลำดับที่เร็วที่สุด — QuickSortความซับซ้อนในการคำนวณขึ้นอยู่กับขนาดของอาร์เรย์และคำนวณโดยใช้สูตร N log(N)
"การจัดเรียงอาร์เรย์ขององค์ประกอบ 1,000 รายการจะเกี่ยวข้องกับการเปรียบเทียบองค์ประกอบอาร์เรย์ประมาณ 10,000 รายการ การจัดเรียงอาร์เรย์ขององค์ประกอบหนึ่งล้านรายการจะเกี่ยวข้องกับการเปรียบเทียบประมาณ 20 ล้านรายการ"
" อย่าเปรียบเทียบมากเกินไปเมื่อคุณพิจารณาจำนวนองค์ประกอบ!"
"นั่นคือสิ่งที่ฉันพูด อัลกอริทึม QuickSortมีประสิทธิภาพมาก
Arrays.binarySearch()
"และวิธีสุดท้ายที่น่าสนใจที่สุดของArrays
คลาสคือสามารถค้นหาค่าที่กำหนดในอาร์เรย์ได้ นี่ไม่ใช่การค้นหาทั่วไป — มันคือการค้นหาไบนารี อันเป็นที่รัก ซึ่งสรุปได้ดังนี้:
- ขั้นแรกให้จัดเรียงอาร์เรย์
- จากนั้นองค์ประกอบตรงกลางของอาร์เรย์จะถูกเปรียบเทียบกับองค์ประกอบที่เรากำลังมองหา
- ถ้าองค์ประกอบมากกว่าองค์ประกอบตรงกลาง การค้นหาจะดำเนินต่อไปในครึ่งขวาของอาร์เรย์
- หากองค์ประกอบที่เรากำลังมองหาน้อยกว่าองค์ประกอบตรงกลาง การค้นหาจะดำเนินต่อไปในครึ่งซ้ายของอาร์เรย์
"เนื่องจากอาร์เรย์ถูกจัดเรียงไว้ จึงเป็นไปได้ที่จะกำจัดครึ่งหนึ่งในการเปรียบเทียบครั้งเดียว จากนั้นในขั้นต่อไป เราจะโยนทิ้งอีกครึ่งหนึ่ง เป็นต้น"
"เยี่ยมมาก! เรามุ่งตรงไปที่เป้าหมายอย่างรวดเร็ว!"
"แน่นอน ในอาร์เรย์ที่มีองค์ประกอบหนึ่งล้าน (!) อัลกอริทึมการค้นหาแบบไบนารีสามารถค้นหาดัชนีขององค์ประกอบที่ต้องการในการเปรียบเทียบเพียง 20 รายการ ข้อบกพร่องของอัลกอริทึมคือต้องเรียงลำดับอาร์เรย์ก่อน และการเรียงลำดับยังต้องใช้เวลา
นี่คือสิ่งที่เรียกว่า:
int index = Arrays.binarySearch(name, value);
" name
ชื่อของอาร์เรย์อยู่ที่ไหนซึ่งต้องผ่านการจัดเรียงแล้ว (เช่นใช้เมธอดArrays.sort()
) และvalue
เป็นองค์ประกอบที่เรากำลังค้นหาในอาร์เรย์ ผลลัพธ์ที่ส่งคืนโดยเมธอดคือดัชนีขององค์ประกอบอาร์เรย์ที่ต้องการ .
ตัวอย่าง:
|
x คือ{-20, -20, -20, -2, 0, 3, 8, 11, 99, 999} 4 1 (ดัชนี0 และ2 ยอมรับได้ด้วย)8 -7 |
"จะเกิดอะไรขึ้นถ้าองค์ประกอบที่ต้องการปรากฏขึ้นหลายครั้งในอาร์เรย์ "
"นั่นเป็นคำถามที่ถูกต้อง Amigo ในกรณีนี้ อัลกอริทึมจะส่งคืนดัชนีของหนึ่งในนั้น (ไม่มีการรับประกันว่ามันจะเป็นอย่างแรก หรือในทางกลับกัน — รายการสุดท้ายที่ซ้ำกันเหล่านี้) "
"จะเกิดอะไรขึ้นถ้าอาร์เรย์ไม่มีองค์ประกอบที่ต้องการเลย"
"ในกรณีนี้ อั ลกอริทึมจะส่งกลับดัชนีเชิงลบ
เอกสาร
"ทุกอย่างชัดเจน Rishi! สิ่งนี้น่าสนใจมาก"
"หากคุณพบว่าสิ่งนี้น่าสนใจจริงๆ ให้ อ่านเอกสารทางการของArrays
ชั้นเรียนและวิธีการต่างๆ ในเว็บไซต์ Oracle ในยามว่าง
"คุณสามารถดูตัวอย่างอย่างละเอียด เช่น the Arrays.mismatch()
และArrays.compare()
วิธีการ คุณมักจะสามารถนำไปใช้ประโยชน์ได้
"และอย่าสับสนกับจำนวนเมธอด แต่ละเมธอดมี 5-10 ตัวแปร ซึ่งต่างกันแค่ประเภทพารามิเตอร์เท่านั้น"
GO TO FULL VERSION