Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Java

เรียนรู้ Java ArrayList: คู่มือครบครันสำหรับการจัดการข้อมูลอย่างมีประสิทธิภาพ

ArrayList เป็นหัวข้อที่นิยมใน Java มันให้ประโยชน์มากกว่าอาร์เรย์มาตรฐานมาก ArrayList ช่วยให้คุณจัดเก็บอ็อบเจกต์ในแถวและลบออกได้เมื่อไม่ต้องการ มันยังช่วยทำการดำเนินการมาตรฐานบนลิสต์ เช่น การเรียงลำดับและการค้นหา หากคุณใช้อาร์เรย์มาตรฐาน คุณจะต้องเขียนตรรกะของตัวเองสำหรับการดำเนินการเหล่านี้ ซึ่งต้องใช้เวลาและความระมัดระวังเพิ่มเติม

ด้วยรายการประโยชน์ที่ยาวนาน ArrayList จึงมีการประยุกต์ใช้ในหลากหลายกรณี อย่างไรก็ตาม การดำเนินการสำคัญที่ไม่ได้มาพร้อมกับ ArrayList คือการพิมพ์ (Printing) ArrayList อาจประกอบด้วยชนิดข้อมูลพื้นฐานมาตรฐาน (เช่น integers และ strings) หรือชนิดข้อมูลขั้นสูง เช่น คลาสที่กำหนดเอง (custom classes) ในแต่ละกรณี การพิมพ์ ArrayList ต้องใช้ขั้นตอนที่แตกต่างกัน

ในบทความนี้ เราจะดู 3 วิธีชั้นนำในการพิมพ์ ArrayList ใน Java ครอบคลุม 2 ประเภทของ ArrayList ที่เราพูดถึงข้างต้น เริ่มเลยดีกว่า!

พิมพ์ Java ArrayList: 3 วิธี

ตามที่กล่าวไว้ มี ArrayList 2 ประเภท: หนึ่งที่มีอ็อบเจกต์ที่มีชนิดข้อมูลพื้นฐานง่ายๆ (เช่น integers และ floats) และอีกอันที่มีอ็อบเจกต์ที่สร้างขึ้นผ่านคลาสกำหนดเอง มีหลายวิธีในการพิมพ์ ArrayList ทั้งสองประเภทนี้

นี่คือ 3 วิธีชั้นนำในการพิมพ์ ArrayList ใน Java:

  • ใช้ for loop
  • ใช้คำสั่ง println
  • ใช้การ implement toString()

วิธีที่ 1: ใช้ for Loop

for loop เป็นหนึ่งในวิธีที่ง่ายที่สุดในการวนซ้ำผ่านลิสต์หรืออาร์เรย์ วิธีนี้ใช้ได้ดีกับอาร์เรย์และ ArrayList ทั้งคู่ เนื่องจากการวนผ่านทุกอีเล็มน์ทีละอันช่วยให้คุณจัดการแต่ละอันได้ตามต้องการ

วิธีนี้ช่วยให้คุณกำหนดการ implement เฉพาะสำหรับแต่ละอีเล็มน์ ไวยากรณ์ของ for loop ดังนี้:

for (int i=0; i<arr.size(); i++) { // Assuming arr is an ArrayList object int current = arr.get(i); // Do something with the current element here }

ตอนนี้มาดูวิธีทั่วไปในการใช้ for loop วนผ่านอาร์เรย์ของอ็อบเจกต์:

ตัวอย่าง for Loop

คุณสามารถใช้ for loop เพื่อพิมพ์ทุกอีเล็มน์ของ ArrayList ได้:

ArrayList<Integer> arr = new ArrayList<>(); arr.add(3); arr.add(4); arr.add(5); arr.add(6); for (int i=0; i<arr.size(); i++) { int curr = arr.get(i); System.out.println(curr); }

เพื่อเพิ่มระดับ คุณสามารถกำหนดกรณีเฉพาะสำหรับแต่ละอีเล็มน์ตามเงื่อนไขได้:

ArrayList arr = new ArrayList<>(); arr.add(3); arr.add(5l); arr.add("Hello World!"); for (int i=0; i<arr.size(); i++) { if (arr.get(i) instanceof Integer) System.out.println(arr.get(i) + " is a number"); else if (arr.get(i) instanceof String) System.out.println(arr.get(i) + " is a string"); else if (arr.get(i) instanceof Long) System.out.println(arr.get(i) + " is a long"); }

เมื่อไรควรใช้วิธีนี้

for loop เหมาะสมสำหรับสถานการณ์ที่คุณมีชุดอีเล็มน์สั้นกว่า และชนิดของพวกมันไม่แตกต่างมาก หากคุณมีลิสต์ 20 รายการที่เป็น integers (int) หรือ strings for loop คือทางเลือก หากคุณมีลิสต์มากกว่า 100 รายการที่อาจเป็น string, int, boolean หรืออะไรก็ตาม for loop จะซับซ้อนเกินไป

วิธีที่ 2: ใช้คำสั่ง println

คำสั่ง println สามารถใช้ได้โดยตรงในกรณีของ ArrayList ที่สร้างจากชนิดข้อมูลพื้นฐาน ชนิดข้อมูลพื้นฐานใน Java รวมถึง string, integer, float, long, double และ boolean หากลิสต์ประกอบด้วยข้อมูลที่ไม่ตรงกับชนิดเหล่านี้ จะไม่สามารถพิมพ์ด้วยวิธีนี้ได้

ไวยากรณ์ของวิธีนี้เรียบง่าย:

System.out.println(arr); // Assuming arr is an ArrayList object

เหตุผลที่วิธีนี้ทำงานได้คือ ชนิดข้อมูลพื้นฐานทั้งหมดสามารถพิมพ์โดยตรงไปยังอุปกรณ์เอาต์พุตมาตรฐานได้ พวกมันไม่ต้องถูกแปลงเป็นรูปแบบที่พิมพ์ได้ ข้อมูลอื่นๆ เช่น ข้อมูลที่จัดเก็บในอินสแตนซ์ของคลาสกำหนดเอง ไม่สามารถแปลงโดยคำสั่ง println โดยตรงได้ ดังนั้นวิธีนี้จึงไม่ทำงานในกรณีนั้น

ตัวอย่าง println

หากคุณพยายามพิมพ์ ArrayList ของ integer แบบง่าย นี่คือวิธีทำ:

ArrayList<Integer> arr = new ArrayList<>(); arr.add(5); arr.add(4); arr.add(6); System.out.println(arr); # => [5, 4, 6]

หากคุณพยายามพิมพ์ ArrayList แบบหลากหลาย (heterogeneous) ก็ทำได้เช่นกัน:

ArrayList<> arr = new ArrayList<>(); arr.add(7); arr.add("Foo"); arr.add(12l); System.out.println(arr); # => [7, Foo, 12]

เมื่อไรควรใช้วิธีนี้

วิธีนี้เหมาะสมเมื่อคุณมีลิสต์สั้นและง่าย และต้องการพิมพ์ออกมาเพื่อการดีบัก (debugging) โปรดทราบว่าวิธีนี้ไม่ยืดหยุ่นเท่าวิธีก่อนหน้า และคุณไม่สามารถจัดรูปแบบเนื้อหาที่พิมพ์ไปยังอุปกรณ์เอาต์พุตได้

นอกจากนี้ หากลิสต์มีข้อมูลที่ไม่ใช่พื้นฐาน (non-primitive) ค่าของมันจะไม่ถูกพิมพ์ไปยังอุปกรณ์ แต่จะพิมพ์ pointer ที่ชี้ไปยังตำแหน่งในหน่วยความจำแทน

class Foo { int bar; public Foo(int bar){ this.bar = bar; }; } ArrayList<> arr = new ArrayList<>(); arr.add(4); arr.add(new Foo(40)); System.out.println(arr); # => [4, 34n2dsf@Foo];

วิธีที่ 3: Implement เมธอด toString()

วิธีนี้ไม่มีข้อบกพร่องของวิธีก่อนหน้า เหตุผลที่อ็อบเจกต์ non-primitive ไม่สามารถพิมพ์ไปยังเอาต์พุตโดยตรงได้คือ คอมไพเลอร์ไม่รู้ว่าจะพิมพ์มันอย่างไร เมธอด toString() ช่วยให้คุณบอกคอมไพเลอร์ว่าต้องพิมพ์อ็อบเจกต์ของคลาสไปยังคอมมานด์ไลน์อย่างไร

มาดูคลาส Foo จากตัวอย่างล่าสุด:

class Foo { int bar; public Foo(int bar){ this.bar = bar; }; }

เพื่อให้พิมพ์ได้ คุณต้อง override และกำหนดเมธอด toString() ในการกำหนดคลาส:

class Foo { int bar; public Foo(int bar){ this.bar = bar; }; public String toString() { return "Bar: " + String.valueOf(bar); } }

ตอนนี้ถ้าคุณสร้างอินสแตนซ์ของ Foo:

และพิมพ์มัน:

คุณจะได้เอาต์พุตที่คุณกำหนดไว้ก่อนหน้านี้:

การแก้ไขเล็กน้อยนี้สามารถร่วมกับเมธอด println เพื่อพิมพ์ ArrayList ทุกประเภทได้อย่างง่ายและรวดเร็ว

ตัวอย่าง toString()

มาดูตัวอย่างล่าสุดจากวิธีที่ 2 และทำให้มัน println-friendly:

class Foo { int bar; public Foo(int bar){ this.bar = bar; }; } ArrayList<> arr = new ArrayList<>(); arr.add(4); arr.add(new Foo(40)); System.out.println(arr); # => [4, Foo@2a139a55];

การเปลี่ยนแปลงเดียวที่ต้องทำคือเพิ่มการกำหนด toString() ในคลาส Foo:

class Foo { int bar; public Foo(int bar){ this.bar = bar; }; public String toString(){ return "Value: " + String.valueOf(bar); } } Now, the println statement will give the desired output: // # => [4, Value: 40]

เมื่อไรควรใช้วิธีนี้

วิธีนี้เหมาะสมสำหรับสถานการณ์ที่คุณต้องการพิมพ์ ArrayList แบบหลากหลาย (heterogeneous) หรือ ArrayList แบบสม่ำเสมอ (homogeneous) ที่ประกอบด้วยคลาสกำหนดเอง การกำหนดเมธอดเพียงครั้งเดียวในคลาสช่วยประหยัดความยุ่งยากที่คุณจะเจอหากใช้ for loop

อย่างไรก็ตาม วิธีนี้อาจดู overkill ในสถานการณ์ที่ง่ายกว่า หากคุณมีลิสต์อีเล็มน์เล็กน้อย คุณสามารถพิจารณาใช้วิธี for loop เพื่อความสะดวกและความเรียบง่ายของตรรกะ

สรุป

การพิมพ์ Java ArrayList ไม่ใช่งานที่ตรงไปตรงมา ยิ่งเนื้อหาของ ArrayList มีความไดนามิกมาก ยิ่งยากที่จะพิมพ์ลิสต์ไปยัง standard output คำสั่ง println สามารถครอบคลุมกรณีส่วนใหญ่ได้ แต่อาจต้องมี toString() override เพื่อให้เสร็จสมบูรณ์

ในบทความนี้ เราครอบคลุม 3 วิธีในการพิมพ์ ArrayList เราดูไวยากรณ์ ตัวอย่าง และสถานการณ์ที่แต่ละวิธีเหมาะสมที่สุด สำหรับทรัพยากร Java ขั้นสูง โปรดสำรวจคู่มือของเราเกี่ยวกับวิธีเรียนรู้ Java