John Squirrels
ระดับ
San Francisco

คลาสอาร์เรย์

เผยแพร่ในกลุ่ม
สวัสดีอีกครั้ง! :) ในบทเรียนวันนี้ เราจะพูดถึงคลาส Arrays ใน Java ในบทเรียนที่แล้ว เราได้รู้จักโครงสร้างข้อมูลที่เรียกว่าอาร์เรย์ เราได้เรียนรู้วิธีสร้างและกรอกข้อมูล และเราดูว่าพวกมันถูกจัดเก็บไว้ในหน่วยความจำอย่างไร วันนี้เราจะมาดูงานและตัวอย่างการทำงานกับอาร์เรย์ที่คุณมักจะเห็นในการทำงานจริง ตัวอย่างเช่น ลองนึกภาพสถานการณ์นี้: เรามีอาร์เรย์ของตัวเลขสุ่ม 10 ตัว
int[] numbers = {167, -2, 16, 99, 26, 92, 43, -234, 35, 80};
งานของเราคือจัดเรียงอาร์เรย์นี้ตามลำดับจากน้อยไปมาก ในท้ายที่สุดควรมีลักษณะดังนี้: [-234, -2, 16, 26, 35, 43, 92, 99, 167] เราจะทำอย่างไร งานนี้ไม่ใช่เรื่องเล็กน้อย เราไม่เคยทำมาก่อน :/ มีไอเดียอะไรไหม? ลองเดาดู นี่คือทางออกหนึ่ง:
  • ผ่านองค์ประกอบทั้งหมดของอาร์เรย์ เปรียบเทียบแต่ละองค์ประกอบกับองค์ประกอบถัดไป ([0] กับ [1], [1] กับ [2], [2] กับ [3] เป็นต้น) หากองค์ประกอบปัจจุบันมากกว่าองค์ประกอบถัดไป เราจะสลับองค์ประกอบเหล่านั้น จากนั้นไปยังองค์ประกอบถัดไป ถ้าไม่ก็ปล่อยไว้ตามเดิมและเดินหน้าต่อไป
  • ดังนั้น หลังจากผ่านองค์ประกอบแรก ค่าที่ใหญ่ที่สุด (167) จึงรับประกันว่าจะอยู่ในเซลล์สุดท้าย
  • ตอนนี้เราจะพูดถึงองค์ประกอบทั้งหมดอีกครั้ง แต่คราวนี้เราจะเริ่มด้วยดัชนี [0] ไปยังองค์ประกอบสุดท้าย (จำนวนที่มากที่สุดอยู่ในตำแหน่งนั้นแล้ว) และทำการเปรียบเทียบและแลกเปลี่ยนแบบเดียวกัน หลังจากผ่านไปแล้ว ในเซลล์สุดท้าย เราจะมีค่ามากเป็นอันดับสอง (99)
  • ทำขั้นตอนนี้ซ้ำหลาย ๆ ครั้งเท่าที่เรามีองค์ประกอบอาร์เรย์
เรามีแนวคิด ตอนนี้เราต้องเขียนโค้ดเท่านั้น ดูเหมือนว่า: คลาสอาร์เรย์และการใช้งาน - 2
public class Main {

   public static void main(String[] args) {

       int[] numbers = {167, -2, 16, 99, 26, 92, 43, -234, 35, 80};

       for (int i = numbers.length - 1; i > 0; i--) {
           for (int j = 0; j < i; j++) {
           /* Compare the elements in pairs.
             If they are not in the right order,
             then swap them */
               if (numbers[j] > numbers[j + 1]) {
                   int tmp = numbers[j];
                   numbers[j] = numbers[j + 1];
                   numbers[j + 1] = tmp;
               }
           }
       }

   }
}
เอ่อ ... มันดูซับซ้อนไปหน่อย -_- ถึงหลักการทั่วไปจะเข้าใจได้ เราก็ยังต้องเขียนโค้ดค่อนข้างเยอะเพื่อแก้ปัญหาง่ายๆ แบบนี้ โอเค บางทีเราอาจจะประเมินตัวเองสูงเกินไป? งานที่เราจัดการอาจยังซับซ้อนเกินไปสำหรับเรา มาลองอะไรที่ง่ายกว่ากัน ตัวอย่างเช่น ใช้อาร์เรย์หมายเลขเดียวกัน
int[] numbers = {167, -2, 16, 99, 26, 92, 43, -234, 35, 80};
งานของเราคือการคัดลอกเนื้อหาไปยังอาร์เรย์อื่น
int [] numbersCopy = new int[10];
ลองคิดดูว่าคุณจะทำอย่างไรโดยใช้สิ่งที่คุณรู้อยู่แล้วเกี่ยวกับอาร์เรย์ ตัวอย่างเช่น คุณสามารถผ่าน อาร์เรย์ ตัวเลขในลูปและเขียนองค์ประกอบตามลำดับลงในnumbersCopy :
public class Main {

   public static void main(String[] args) {

       int[] numbers = {167, -2, 16, 99, 26, 92, 43, -234, 35, 80};

       int [] numbersCopy = new int[10];

       for (int i = 0; i < numbers.length; i++) {

           numbersCopy[i] = numbers[i];
       }

   }
}
อืม จริง ๆ แล้วเราก็ทำสำเร็จแล้ว! ดูเหมือนว่าเราได้แก้ไขปัญหาแล้ว อย่างไรก็ตาม หากคุณจำเป็นต้องทำเช่นนี้บ่อยๆ โค้ดของคุณจะมีลูปที่เหมือนกันหลายชุด ในความเป็นจริง งานเหล่านี้ (และอื่นๆ) ได้รับการแก้ไขโดยผู้สร้าง Java มานานแล้ว เราไม่จำเป็นต้อง "สร้างวงล้อใหม่" และเขียนโค้ดโซลูชันของเราเอง มีคลาสสแตติกพิเศษ ( อาร์เรย์ ) เพื่อช่วยคุณทำงานทั่วไปเมื่อทำงานกับอาร์เรย์ มีการเพิ่มเมธอดสำหรับการทำงานทั่วไปที่โปรแกรมเมอร์ Java เผชิญในคลาสนี้ ตัวอย่างเช่น งานของการเรียงลำดับอาร์เรย์ที่เราพยายามจัดการ ได้รับการแก้ไขในบรรทัดเดียว:
public class Main {

   public static void main(String[] args) {

       int[] numbers = {167, -2, 16, 99, 26, 92, 43, -234, 35, 80};

       Arrays.sort(numbers);

       System.out.println(Arrays.toString(numbers));

   }
}
Arrays.sort ()วิธีการเรียงลำดับอาร์เรย์ และอัลกอริธึมของมันก็มีประสิทธิภาพมากกว่าโค้ดที่เราเขียน เอาต์พุตคอนโซล: [-234, -2, 16, 26, 35, 43, 80, 92, 99, 167] หมายเหตุ: ในการแปลงอาร์เรย์เป็นสตริง เราใช้วิธีอื่นของ คลาส อาร์เรย์ : Arrays.toString() . อาร์เรย์ใน Java ไม่ได้แทนที่เมธอดtoString()ด้วยตัวเอง ดังนั้นหากคุณเพียงแค่เขียน
System.out.println(numbers.toString());
toString() ของคลาสวัตถุจะถูกเรียก สำหรับอาร์เรย์ เอาต์พุตจะเป็นดังนี้: [I@4554617c เราจะไม่ลงรายละเอียดในตอนนี้เกี่ยวกับสาเหตุที่ทำให้เป็นเอาต์พุต สิ่งสำคัญคือชัดเจนว่าไม่ใช่สิ่งที่เราต้องการ แต่Arrays.toString()ทำในสิ่งที่เราต้องการอย่างแม่นยำ นอกจากนี้ การคัดลอกยังทำได้อย่างง่ายดายด้วย คลาส Arrays :
public class Main {

   public static void main(String[] args) {

       int[] numbers = {167, -2, 16, 99, 26, 92, 43, -234, 35, 80};

       int [] numbersCopy = Arrays.copyOf(numbers, numbers.length);
       System.out.println(Arrays.toString(numbersCopy));

   }
}
เราส่งผ่านไปยังArrays.copyOf()เมธอดอาร์เรย์เดิมของเรา (ซึ่งเราต้องการคัดลอกค่า) และความยาวของอาร์เรย์ใหม่ที่เรากำลังคัดลอกข้อมูล ในกรณีนี้ เราระบุตัวเลขความยาวเป็นความยาว เนื่องจากต้องการคัดลอกอาร์เรย์ทั้งหมด หากเราต้องการคัดลอกเฉพาะองค์ประกอบแรกๆ เราสามารถระบุความยาวของอาร์เรย์ใหม่ที่มีขนาดเล็กลงได้:
public class Main {

   public static void main(String[] args) {

       int[] numbers = {167, -2, 16, 99, 26, 92, 43, -234, 35, 80};

       int [] numbersCopy = Arrays.copyOf(numbers, 4);
       System.out.println(Arrays.toString(numbersCopy));

   }
}
ที่นี่เราระบุ 4 เป็นความยาวของอาร์เรย์ใหม่ ดังนั้น เฉพาะ 4 องค์ประกอบแรกของตัวเลขเท่านั้นที่จะถูกคัดลอกไปยังอาร์เรย์ใหม่ เอาต์พุตของคอนโซล: [167, -2, 16, 99] อย่างไรก็ตามArraysยังให้คุณคัดลอกส่วนหนึ่งของอาร์เรย์จากตรงกลางแทนที่จะเป็นจุดเริ่มต้นของอาร์เรย์:
public class Main {

   public static void main(String[] args) {

       int[] numbers = {167, -2, 16, 99, 26, 92, 43, -234, 35, 80};

       int [] numbersCopy = Arrays.copyOfRange(numbers, 2,6);
       System.out.println(Arrays.toString(numbersCopy));

   }
}
เอาต์พุต: [16, 99, 26, 92] ตัวเลขถูกคัดลอกไปยังอาร์เรย์ใหม่จากอาร์เรย์ที่สองจากองค์ประกอบที่สอง (รวม) ไปยังองค์ประกอบที่หก (ไม่รวม) เราอาจต้องเปรียบเทียบสองอาร์เรย์ด้วย เช่นเดียวกับ เมธอด toString()อาร์เรย์เองจะไม่แทนที่เมธอดequals () ดังนั้นหากเราลองเปรียบเทียบกันแบบนี้
public class Main {

   public static void main(String[] args) {

       int[] numbers = {1, 2, 3};
       int[] numbers2 = {1, 2, 3};

       System.out.println(numbers.equals(numbers2));
   }
}
แล้วเราจะได้เท็จ นี่เป็นเพราะObject.equals()ซึ่งเปรียบเทียบการอ้างอิงจะถูกเรียก และแน่นอนว่ามันต่างกัน! แต่สิ่งที่เราต้องการคือการเปรียบเทียบเนื้อหาของอาร์เรย์ ไม่ใช่การอ้างอิง คลาสArraysแทนที่ วิธี การเท่ากับ ()เพื่อให้ทำในสิ่งที่เราต้องการ:
public class Main {

   public static void main(String[] args) {

       int[] numbers = {1, 2, 3};
       int[] numbers2 = {1, 2, 3};

       System.out.println(Arrays.equals(numbers, numbers2));
   }
}
ผลลัพธ์: จริง อย่างไรก็ตาม คลาส Arraysไม่เพียงทำงานกับอาร์เรย์ธรรมดาเท่านั้น แต่ยังใช้กับอาร์เรย์สองมิติด้วย:
public class Main {

   public static void main(String[] args) {

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

       int[][] numbersCopy = Arrays.copyOf(numbers, numbers.length);

       System.out.println("Are these two-dimensional arrays equal?");
       System.out.println(Arrays.deepEquals(numbers, numbersCopy));

       System.out.println(Arrays.deepToString(numbersCopy));
   }
}
ผลลัพธ์: อาร์เรย์สองมิติเหล่านี้เท่ากันหรือไม่ จริง [[1, 2, 3], [4, 5, 6], [7, 8, 9]] อย่างที่คุณเห็น เมธอด Arrays.copyOf()สามารถคัดลอกอาร์เรย์สองมิติได้ และคลาสมีเมธอดพิเศษสำหรับการเปรียบเทียบและแสดงอาร์เรย์สองมิติ: deepEquals และ deepToString () ในอนาคต คุณจะเห็น (และชื่นชมยินดีในความจริงที่ว่า) ซ้ำๆ ว่าผู้สร้างของ Java ได้คาดการณ์ถึงสถานการณ์ต่างๆ มากมายที่โปรแกรมเมอร์ต้องเผชิญอยู่บ่อยๆ และนำโซลูชันสำเร็จรูปสำหรับพวกเขาไปใช้ในภาษานั้น การใช้วิธีแก้ปัญหาเหล่านี้ง่ายกว่าและสะดวกกว่าการประดิษฐ์ล้อขึ้นมาใหม่ใช่ไหม? :) อย่าลืมอ่านเอกสารสำหรับคลาส Arrays บนเว็บไซต์Oracle ขอให้โชคดีในการเรียน!
ความคิดเห็น
  • เป็นที่นิยม
  • ใหม่
  • เก่า
คุณต้องลงชื่อเข้าใช้เพื่อแสดงความคิดเห็น
หน้านี้ยังไม่มีความคิดเห็นใด ๆ