JavaRush /จาวาบล็อก /Random-TH /คอลเลกชันใน Java | คอลเลกชั่นจาวา

คอลเลกชันใน Java | คอลเลกชั่นจาวา

เผยแพร่ในกลุ่ม
สวัสดี! ในช่วงสองสามบทเรียนที่ผ่านมา เรามีความก้าวหน้าอย่างมากในการเรียนรู้ ArrayList อย่างไรก็ตาม ในช่วงเวลานี้ เราดำเนินการเฉพาะการดำเนินการที่ง่ายที่สุดเท่านั้น: การลบ การแทรก และการส่งออกไปยังคอนโซล แน่นอนว่านี่ไม่ใช่จุดสิ้นสุดของรายการปัญหาที่นักพัฒนาต้องเผชิญเมื่อใช้ArrayList จำการบรรยายเกี่ยวกับอาร์เรย์และ คลาส Arrays ได้ ไหม? ได้รับการพัฒนาโดยผู้สร้าง Java โดยเฉพาะเพื่อแก้ไขปัญหาทั่วไปที่โปรแกรมเมอร์พบเมื่อทำงานกับอาร์เรย์ แล้วArrayList ล่ะ ? แน่นอนว่ายังมีรายการงานทั่วไปสำหรับเขาด้วย พวกเขาทั้งหมดถูกนำไปใช้ในชั้นเรียนที่แยกจากกันหรือเราจะต้องเขียนพฤติกรรมที่ต้องการด้วยตนเองในแต่ละครั้ง? แน่นอนว่าคุณไม่จำเป็นต้องเขียนทุกอย่างด้วยตัวเอง การดำเนินการทั่วไปส่วนใหญ่ที่ดำเนินการเมื่อใช้คอลเลกชันใน Java ได้ถูกนำไปใช้แล้วในคอลเลกชันคลาสคงที่พิเศษ คอลเลกชันของชั้นเรียน - 1

คอลเลกชันใน Java

“Collections” เป็นชื่อทั่วไปสำหรับโครงสร้างข้อมูลต่างๆ ใน ​​Java ข้อมูลสามารถจัดเก็บได้หลายวิธี จนถึงตอนนี้เราได้ศึกษาเฉพาะคลาส ArrayListซึ่งข้อมูลถูกเก็บไว้ในอาร์เรย์ เราจะทำความคุ้นเคยกับคอลเลกชันที่เหลือในภายหลัง ตอนนี้ก็เพียงพอแล้วที่จะเข้าใจว่าคลาส Collections ได้รับการออกแบบมาเพื่อทำงานไม่เพียงกับ ArrayList เท่านั้น แต่ยังรวมถึงคอลเลกชันประเภทอื่น ๆ ใน Java ด้วย (ดังนั้นในความเป็นจริงแล้วชื่อของมัน) ดังนั้นคลาส Collections อนุญาตให้คุณแก้ไขงานใดเมื่อทำงานกับ ArrayList สิ่งแรกและชัดเจนที่สุดคือการเรียงลำดับ ในการบรรยายเรื่องอาร์เรย์ เราดูตัวอย่างที่มีตัวเลข และตอนนี้เรามาดูตัวอย่างที่มีสตริงกัน ในการจัดเรียงเนื้อหาของคอลเลกชั่น คลาส Collections จะใช้เมธอดต่อไปนี้sort():
public class Main {

   public static void main(java.lang.String[] args) {

       String mercury = new String("Mercury");
       String venus = new String("Venus");
       String earth = new String("Earth");
       String mars = new String("Mars");
       String jupiter = new String("Jupiter");
       String saturn = new String("Saturn");
       String uranus = new String("Uranus");
       String neptune = new String("Neptune");

       ArrayList<String> solarSystem = new ArrayList<>(Arrays.asList(mercury, venus, earth, mars,
               jupiter, saturn, uranus, neptune));
       Collections.sort(solarSystem);
       System.out.println(solarSystem);

   }
}
บทสรุป:

[Венера, Земля, Марс, Меркурий, Нептун, Сатурн, Уран, Юпитер]
เส้นถูกจัดเรียงตามตัวอักษร! ทำไมต้องเรียงตามลำดับตัวอักษร? คลาสนี้Stringถูกตั้งโปรแกรมไว้เพื่อกำหนดวิธีการเปรียบเทียบสตริงระหว่างกันอย่างชัดเจน (ตามตัวอักษรอย่างแม่นยำ) สำหรับชั้นเรียนที่คุณจะสร้างขึ้นเอง คุณสามารถใช้กลไกการเปรียบเทียบของคุณเองได้ แต่เราจะพูดถึงเรื่องนี้ในการบรรยายอื่น ๆ นอกจากนี้ คลาส Collections ยังช่วยให้คุณค้นหาองค์ประกอบขั้นต่ำและสูงสุดในไฟล์ArrayList. ทำได้โดยใช้ วิธี min()และmax():
public static void main(java.lang.String[] args) {

   ArrayList<Integer> numbers = new ArrayList<>(Arrays.asList(1,2,3,4,5,6,7));
   System.out.println(Collections.max(numbers));
   System.out.println(Collections.min(numbers));

}
บทสรุป:

7
1
แน่นอนว่าวิธีนี้สะดวกกว่าการเขียนโค้ดด้วยตนเองเพื่อดูองค์ประกอบทั้งหมดและค้นหาองค์ประกอบที่ใหญ่ที่สุด/เล็กที่สุด :) อีกวิธีที่มีประโยชน์อย่างยิ่งreverse()คือ หากเราต้องการ "ย้อนกลับ" รายการเพื่อให้องค์ประกอบต่างๆ อยู่ในลำดับที่กลับกัน เราจะทำอย่างไร? การเขียนอัลกอริทึมด้วยตัวเองคงไม่ง่ายขนาดนี้ :) โชคดีที่วิธีการนี้reverse()รู้วิธีการทำเช่นนี้อยู่แล้ว ตัวอย่างเช่น เราไม่ชอบวิธีการsort()จัดเรียงดาวเคราะห์ของเราตามลำดับตัวอักษร และเราต้องการเปลี่ยนลำดับไปกลับกัน - จาก Z เป็น A:
public class Main {

   public static void main(java.lang.String[] args) {

       String mercury = new String("Mercury");
       String venus = new String("Venus");
       String earth = new String("Earth");
       String mars = new String("Mars");
       String jupiter = new String("Jupiter");
       String saturn = new String("Saturn");
       String uranus = new String("Uranus");
       String neptune = new String("Neptune");

       ArrayList<String> solarSystem = new ArrayList<>(Arrays.asList(mercury, venus, earth, mars,
               jupiter, saturn, uranus, neptune));
       Collections.sort(solarSystem);
       Collections.reverse(solarSystem);
       System.out.println(solarSystem);

   }
}
บทสรุป:

[Юпитер, Уран, Сатурн, Нептун, Меркурий, Марс, Земля, Венера]
ยังไงก็ตาม เรามักจะพูดถึงการเรียงลำดับ ลำดับขององค์ประกอบ ฯลฯ ในที่นี้ จะเกิดอะไรขึ้นถ้างานของเราตรงกันข้าม? ตัวอย่างเช่น เรากำลังพยายามใช้กลไกลอตเตอรี เราได้เพิ่มตัวเลข 100 ตัวลงในวงล้อ ซึ่งควรจะปรากฏบนหน้าจอทีละตัว ผู้เข้าร่วมคนแรกที่ขีดฆ่าหมายเลขทั้งหมดบนตั๋วจะเป็นผู้ชนะ มันง่ายมากที่จะใช้กลไกดังกล่าวโดยใช้วิธีการshuffle():
public class Main {

   public static void main(java.lang.String[] args) {

       ArrayList<Integer> lottery = new ArrayList<>(100);
       for (int i = 1; i <= 100; i++) {

           lottery.add(i);//add numbers from 1 to 100 to the drum
       }

       Collections.shuffle(lottery);//mix
       System.out.println("Attention! The first 10 numbers appear from the drum!");
       for (int i = 0; i < 10; i++) {

           System.out.println(lottery.get(i));
       }

   }
}
บทสรุป:

Внимание! Из барабана появляются первые 10 чисел!
32
61
4
81
25
8
66
35
42
71
มันง่ายมาก! ปัญหาได้รับการแก้ไขแล้ว และเกมของเราก็เขียนขึ้นแล้ว :) ทีนี้ลองจินตนาการถึงสถานการณ์ที่แตกต่างออกไป ก่อนหน้านี้เราได้สร้างรายการsolarSystemที่มีดาวเคราะห์อยู่ในนั้น และดูเหมือนว่าจะเหมาะกับเราทุกคน หากไม่ใช่เพื่อสิ่งเดียว คุณสามารถลบองค์ประกอบออกจากองค์ประกอบนั้นและเพิ่มองค์ประกอบใหม่ได้! เห็นได้ชัดว่านี่ไม่ใช่พฤติกรรมที่เราคาดหวัง: ระบบสุริยะในโปรแกรมของเราควรอยู่ในสถานะไม่เปลี่ยนแปลง คลาส Collections มีวิธีการที่น่าสนใจมาก - unmodifiableList(). มันสร้างรายการที่กำหนดในเวอร์ชันที่ไม่เปลี่ยนรูป จะไม่สามารถเพิ่มหรือลบองค์ประกอบออกไปได้ ในกรณีรายชื่อดาวเคราะห์ในระบบสุริยะ นั่นคือสิ่งที่เราต้องการ!
public class Main {

   public static void main(java.lang.String[] args) {

       String mercury = new String("Mercury");
       String venus = new String("Venus");
       String earth = new String("Earth");
       String mars = new String("Mars");
       String jupiter = new String("Jupiter");
       String saturn = new String("Saturn");
       String uranus = new String("Uranus");
       String neptune = new String("Neptune");

       List<String> solarSystem = Collections.unmodifiableList(new ArrayList<>(Arrays.asList(mercury, venus, earth, mars,
               jupiter, saturn, uranus, neptune)));
       solarSystem.add("Pluto");//try to add a new element
   }
}

Exception in thread "main" java.lang.UnsupportedOperationException
	at java.util.Collections$UnmodifiableCollection.add(Collections.java:1075)
	at Main.main(Main.java:21)
ข้อผิดพลาด: solarSystemตอนนี้คุณไม่สามารถเพิ่มอะไรได้เลย! สิ่งเดียวที่คุณต้องใส่ใจในกรณีนี้คือประเภทของตัวแปรต้องเป็นList<>ไม่ใช่ArrayList<>(เมธอดนี้จะส่งคืนออบเจ็กต์ประเภทนี้ทุกประการ ซึ่งเหมือนกันกับรายการทุกประเภท) สถานการณ์ทั่วไปอีกประการหนึ่งที่อาจเกิดขึ้นระหว่างทำงานคือโปรแกรมเมอร์เพิ่มองค์ประกอบในลำดับที่ไม่ถูกต้อง หากสิ่งนี้เกิดขึ้น และดาวพุธและดาวเนปจูนเปลี่ยนสถานที่โดยไม่คาดคิด วิธีการต่อไปนี้จะช่วยเราแก้ไขข้อผิดพลาดนี้swap():
public class Main {

   public static void main(java.lang.String[] args) {

       String mercury = new String("Mercury");
       String venus = new String("Venus");
       String earth = new String("Earth");
       String mars = new String("Mars");
       String jupiter = new String("Jupiter");
       String saturn = new String("Saturn");
       String uranus = new String("Uranus");
       String neptune = new String("Neptune");

       ArrayList<String> solarSystem = new ArrayList<>(Arrays.asList(neptune, venus, earth, mars
       , jupiter, saturn, uranus, mercury));// wrong planet order
       System.out.println(solarSystem);

       Collections.swap(solarSystem, solarSystem.indexOf(mercury), solarSystem.indexOf(neptune));
       System.out.println(solarSystem);

   }
}
เราส่งรายการของเรา ไปยัง method swap()รวมถึงดัชนีขององค์ประกอบทั้งสองที่ต้องสลับ โปรดทราบ: วิธีการนี้ใช้ได้กับดัชนีโดยเฉพาะ ไม่ใช่กับลิงก์ ดังนั้นที่นี่เราจำเป็นต้องมีวิธีArrayList.indexOf()การ บทสรุป:

[Нептун, Венера, Земля, Марс, Юпитер, Сатурн, Уран, Меркурий]

[Меркурий, Венера, Земля, Марс, Юпитер, Сатурн, Уран, Нептун]
สุดท้ายนี้เรามาทำความรู้จักกับวิธีการที่น่าสนใจมากกันดีกว่า - disjoint(). จะตรวจสอบว่าสองคอลเลกชันมีจุดตัดกันหรือไม่ นั่นคือองค์ประกอบที่เหมือนกันอย่างน้อยหนึ่งองค์ประกอบ ถ้าไม่ก็ส่งคืนtrueถ้าใช่ก็ส่งfalseคืน
public class Main {

   public static void main(java.lang.String[] args) {

       String mercury = new String("Mercury");
       String venus = new String("Venus");
       String earth = new String("Earth");
       String mars = new String("Mars");
       String jupiter = new String("Jupiter");
       String saturn = new String("Saturn");
       String uranus = new String("Uranus");
       String neptune = new String("Neptune");

       ArrayList<String> solarSystemPart1 = new ArrayList<>(Arrays.asList(mercury, venus, earth, mars));
       ArrayList<String> solarSystemPart2 = new ArrayList<>(Arrays.asList(jupiter, saturn, uranus, neptune));

       System.out.println(Collections.disjoint(solarSystemPart1, solarSystemPart2));

   }
}
อย่างที่คุณเห็น องค์ประกอบในสองรายการของเราแตกต่างกันโดยสิ้นเชิง ดังนั้นโปรแกรมจึงส่งtrueออก นี่เป็นชั้นเรียนที่น่าสนใจและมีประโยชน์มาก เช่นเดียวกับArraysเขาทำงานประจำและต่ำต้อยให้เรามากมาย ทำให้เรามุ่งความสนใจไปที่สิ่งอื่นได้ อ่านเกี่ยวกับเรื่องนี้ใน เอกสาร ของ Oracleมีวิธีอื่นอยู่ที่นั่น
ความคิดเห็น
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION