1.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 โปรดจำไว้ว่าองค์ประกอบสุดท้ายไม่รวมอยู่ในช่วง

ตัวอย่าง:

int[] x = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

Arrays.fill(x, 3, 7, 999);


String str = Arrays.toString(x);


เรากำลังเติมเซลล์x[3], x[4], x[5], และด้วยx[6]ค่า 999เซลล์ของอาร์เรย์มีหมายเลขเริ่มต้นจากศูนย์!

ตัวแปรstrประกอบด้วยค่า:
"[1, 2, 3, 999, 999, 999, 999, 8, 9, 10]"

วิธี นี้Arrays.fill()ใช้ได้กับอาร์เรย์หนึ่งมิติเท่านั้น หากคุณส่งผ่านอาร์เรย์สองมิติไปยังเมธอด จะถือว่าเป็นหนึ่งมิติพร้อมกับผลที่ตามมาทั้งหมด



2.Arrays.copyOf()

ดังที่คุณทราบแล้ว คุณไม่สามารถปรับขนาดอาร์เรย์ได้หลังจากที่สร้างเสร็จแล้ว

แต่ถ้าคุณต้องการจริงๆล่ะ

ถ้าคุณต้องการจริงๆ คุณก็ทำได้!

  • สร้างอาร์เรย์ใหม่ตามความยาวที่ต้องการ
  • คัดลอกองค์ประกอบทั้งหมดจากอาร์เรย์แรกลงไป

โดยวิธีการนี้เป็นสิ่งที่Arrays.copyOf()วิธีการทำ นี่คือสิ่งที่เรียกว่า:

Type[] name2 = Arrays.copyOf(name, length);

วิธีนี้ไม่ได้เปลี่ยนอาร์เรย์ที่มีอยู่แต่สร้างอาร์เรย์ใหม่ แทน และคัดลอกองค์ประกอบของอาร์เรย์เก่าลงไป

หากองค์ประกอบไม่พอดี ( ความยาวน้อยกว่าความยาวของอาร์เรย์ที่มีอยู่ ) ค่าพิเศษจะถูกละเว้น

ถ้าความยาวของอาร์เรย์ใหม่มากกว่าความยาวของอาร์เรย์เก่า เซลล์จะเต็มไปด้วยเลขศูนย์

ตัวอย่าง:

int[] x = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

int[] x2 = Arrays.copyOf(x, 5);
String str2 = Arrays.toString(x2);

int[] x3 = Arrays.copyOf(x, 15);
String str3 = Arrays.toString(x3);


ตัวแปรstr2ประกอบด้วยค่า:
"[1, 2, 3, 4, 5]"

ตัวแปรstr3ประกอบด้วยค่า:
"[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 0, 0, 0, 0, 0]"

3.Arrays.copyOfRange()

และถ้าคุณต้องการรับอาร์เรย์ที่มีความยาว 5 จากอาร์เรย์ที่มีความยาว 10 แต่คุณต้องการให้มีองค์ประกอบ 5 รายการสุดท้ายมากกว่า 5 รายการแรก

ในกรณีนี้ วิธีอื่นของArraysคลาสจะมีประโยชน์ นั่นคือArrays.copyOfRange(). นี่คือลักษณะเมื่อเราเรียกมันว่า:

Type[] name2 = Arrays.copyOfRange(name, first, last);

วิธีนี้ยังสร้างอาร์เรย์ใหม่ แต่เติมด้วยองค์ประกอบจากตำแหน่งที่กำหนดในอาร์เรย์เดิม โดยที่ตัวแรกและตัวสุดท้ายคือดัชนีขององค์ประกอบตัวแรกและตัวสุดท้ายที่ควรใส่ในอาร์เรย์ใหม่

ตามประเพณีเก่าแก่ที่ดีของ Java โปรดจำไว้ว่าองค์ประกอบสุดท้ายไม่รวมอยู่ในช่วง

ตัวอย่าง:

int[] x = {11, 12, 13, 14, 15, 16, 17, 18, 19, 20};

int[] x2 = Arrays.copyOfRange(x, 5, 10);
String str2 = Arrays.toString(x2);

int[] x3 = Arrays.copyOfRange(x, 5, 15);
String str3 = Arrays.toString(x3);


ตัวแปรstr2ประกอบด้วยค่า:
"[16, 17, 18, 19, 20]"

ตัวแปรstr3ประกอบด้วยค่า:
"[16, 17, 18, 19, 20, 0, 0, 0, 0, 0]"


4.Arrays.sort()

อา การรักษาที่อร่อยที่สุด: การเรียงลำดับ อาร์เรย์ถูกจัดเรียงค่อนข้างบ่อยในการเขียนโปรแกรม การกระทำที่พบบ่อยที่สุดสามประการเมื่อทำงานกับอาร์เรย์คือ:

  • การเรียงลำดับอาร์เรย์
  • การค้นหาองค์ประกอบต่ำสุด (หรือสูงสุด) ของอาร์เรย์
  • การกำหนดดัชนีขององค์ประกอบในอาร์เรย์ (การค้นหาองค์ประกอบในอาร์เรย์)

นี่เป็นเหตุผลว่าทำไมผู้สร้างของ Java จึงรวมsort()วิธีการไว้ในArraysคลาส นี่คือสิ่งที่เรียกว่า:

Arrays.sort(name);

วิธีนี้จะเรียงลำดับอาร์เรย์ที่ส่งผ่านจากน้อยไปหามาก

ตัวอย่าง:

int[] x = {11, -2, 3, 0, 999, -20, 8, -20, 99, -20};

Arrays.sort(x);

String str = Arrays.toString(x);



ตัวแปรstrประกอบด้วยค่า:
"[-20, -20, -20, -2, 0, 3, 8, 11, 99, 999]"

ยอดเยี่ยมใช่มั้ย คุณเรียกใช้เมธอดหนึ่ง และตอนนี้คุณมีอาร์เรย์ที่เรียงลำดับแล้ว สวย.

อย่างไรก็ตาม คุณสามารถใช้วิธีนี้เพื่อจัดเรียงไม่เฉพาะอาร์เรย์ทั้งหมด แต่เพียงบางส่วนเท่านั้น นี่คือสิ่งที่เรียกว่า:

Arrays.sort(name, first, last);

โดยที่ตัวแรกและตัวสุดท้ายคือดัชนีของเซลล์แรกและเซลล์สุดท้ายที่การเรียงลำดับควรสัมผัส

ตามประเพณีเก่าแก่ที่ดีของ Java โปรดจำไว้ว่าองค์ประกอบสุดท้ายไม่รวมอยู่ในช่วง

ตัวอย่าง:

int[] x = {11, -2, 3, 0, 999, -20, 8, -20, 99, -20};

Arrays.sort(x, 4, 8);
String str = Arrays.toString(x);


ตัวแปรstrประกอบด้วยค่า:
"[11, -2, 3, 0, -20, -20, 8, 999, 99, -20]"

ในการจัดเรียงอาร์เรย์ Java ใช้อัลกอริทึมการเรียงลำดับที่เร็วที่สุด— QuickSort ความซับซ้อนในการคำนวณขึ้นอยู่กับขนาดของอาร์เรย์และคำนวณโดยใช้สูตร N log(N)

การจัดเรียงอาร์เรย์ขององค์ประกอบ 1,000 รายการจะเกี่ยวข้องกับการเปรียบเทียบองค์ประกอบอาร์เรย์ประมาณ 3,000 รายการ การจัดเรียงอาร์เรย์ขององค์ประกอบหนึ่งล้านรายการจะเกี่ยวข้องกับการเปรียบเทียบประมาณ 6 ล้านรายการ



5.Arrays.binarySearch()

และวิธีการสุดท้ายที่น่าสนใจที่สุดของArraysคลาสคือสามารถค้นหาค่าที่กำหนดในอาร์เรย์ นี่ไม่ใช่การค้นหาทั่วไป — เป็นการค้นหาไบนารี อันเป็นที่ รัก มันเดือดลงไปนี้:

  • ขั้นแรกให้จัดเรียงอาร์เรย์
  • จากนั้นองค์ประกอบตรงกลางของอาร์เรย์จะถูกเปรียบเทียบกับองค์ประกอบที่เรากำลังมองหา
  • หากองค์ประกอบมากกว่าองค์ประกอบตรงกลาง การค้นหาจะดำเนินต่อไปในครึ่งขวาของอาร์เรย์
  • หากองค์ประกอบที่เรากำลังมองหาน้อยกว่าองค์ประกอบตรงกลาง การค้นหาจะดำเนินต่อไปในครึ่งซ้ายของอาร์เรย์

เนื่องจากการจัดเรียงอาร์เรย์จึงเป็นไปได้ที่จะกำจัดครึ่งหนึ่งในการเปรียบเทียบครั้งเดียว จากนั้นในขั้นต่อไป เราก็โยนทิ้งอีกครึ่งหนึ่ง ไปเรื่อยๆ

วิธีการนี้ทำให้การค้นหาแบบไบนารีรวดเร็วมาก ในอาร์เรย์ที่มีองค์ประกอบหนึ่งล้าน (!) สามารถค้นหาดัชนีขององค์ประกอบที่ต้องการได้ในการเปรียบเทียบเพียง 20 รายการ ข้อบกพร่องของแนวทางคือต้องเรียงลำดับอาร์เรย์ก่อน และการเรียงลำดับยังต้องใช้เวลาอีกด้วย

นี่คือสิ่งที่เรียกว่า:

int index = Arrays.binarySearch(name, value);

nameชื่อของอาร์เรย์ซึ่งจะต้องผ่านการจัดเรียงแล้วอยู่ที่ไหน (เช่น ใช้ Arrays.sort()เมธอด) และvalueเป็นองค์ประกอบที่เรากำลังค้นหาในอาร์เรย์ ผลลัพธ์ที่ส่งคืนโดยเมธอดคือดัชนีขององค์ประกอบอาร์เรย์ที่ต้องการ

ตัวอย่าง:

int[] x = {11, -2, 3, 0, 999, -20, 8, -20, 99, -20};
Arrays.sort(x);

int index1 = Arrays.binarySearch(x, 0);
int index2 = Arrays.binarySearch(x, -20);
int index3 = Arrays.binarySearch(x, 99);
int index4 = Arrays.binarySearch(x, 5);
xเป็น:
{-20, -20, -20, -2, 0, 3, 8, 11, 99, 999}

4
1(ดัชนี0และ2เป็นที่ยอมรับด้วย)
8
-7

หากอาร์เรย์มีหลายอินสแตนซ์ขององค์ประกอบที่กำลังค้นหา อัลกอริทึมจะส่งกลับดัชนีของหนึ่งในนั้น (ไม่มีการรับประกันว่ามันจะเป็นรายการแรกหรือกลับกัน — รายการสุดท้ายเหล่านี้ องค์ประกอบที่ซ้ำกัน)"

หากไม่พบองค์ประกอบในอาร์เรย์ ดัชนีจะเป็นค่าลบ



6. ลิงก์ไปยังเอกสาร Oracle ในArraysชั้นเรียน

หากคุณสนใจเป็นพิเศษ คุณสามารถอ่านทุกอย่างเกี่ยวกับArraysคลาสและวิธีการทั้งหมดในเอกสารอย่างเป็นทางการที่ href="https://docs.oracle.com/en/java/javase/14/docs/api/java.base /java/util/Arrays.html">บนเว็บไซต์ Oracle

ตัวอย่างเช่น คุณสามารถอ่านเกี่ยวกับวิธีการArrays.mismatch()และ Arrays.compare()บางทีคุณจะพบว่ามันมีประโยชน์อย่างใด

และอย่าสับสนกับจำนวนวิธี แต่ละวิธีมี 5-10 ตัวแปร ซึ่งแตกต่างกันในประเภทพารามิเตอร์เท่านั้น