ในการจัดระเบียบวัตถุประเภทเดียวกันที่เก็บไว้ในอาร์เรย์หรือคอลเลกชัน นักพัฒนา Java ได้สร้าง
อินเทอร์เฟซ
หนึ่งในวิธีที่ง่ายและมีประสิทธิภาพมากที่สุดในการจัดเรียงอาร์เรย์ของ
Comparable
. ประกาศเพียงวิธีเดียวcompareTo
:
public interface Comparable<T> {
public int compareTo(T o);
}
Comparable
จะถูกกำหนดพารามิเตอร์ตามประเภทของออบเจ็กต์ที่ยอมรับเป็นพารามิเตอร์ของcompareTo
เมธอด ในกรณีนี้ เราเตือนคอมไพลเลอร์ว่าเราจะเปรียบเทียบวัตถุประเภทใด หากไม่ตรงตามเงื่อนไขการระบุประเภท เราจะได้รับข้อผิดClassCastException
พลาด วิธีการcompareTo
ใน Java เปรียบเทียบวัตถุที่เรียกกับวัตถุที่ส่งผ่านเป็นพารามิเตอร์และส่งกลับจำนวนเต็มเป็นผลมาจากการเปรียบเทียบ:
- ค่าบวกถ้าวัตถุที่เรียกมีขนาดใหญ่กว่าวัตถุที่ส่งผ่านเป็นพารามิเตอร์
- เป็นค่าลบหากวัตถุที่เรียกมีขนาดเล็กกว่าวัตถุที่ส่งผ่านเป็นพารามิเตอร์
- จะเป็นโมฆะหากวัตถุเท่ากัน
เหตุใดจึงจำเป็นต้องใช้วิธี CompareTo ใน Java
โปรแกรมเมอร์ Java มักจะต้องจัดการกับอาร์เรย์และรายการของวัตถุ เมื่อทำงานกับข้อมูลจำนวนมาก มักจะสะดวกในการจัดเก็บข้อมูลในรูปแบบที่จัดระเบียบหรือเรียงลำดับ ประการแรก การทำงานกับคอลเลกชันจะเร็วขึ้นเมื่อค้นหาข้อมูลที่จำเป็น และประการที่สอง ข้อมูลที่จัดระเบียบจะมองเห็นได้ดีขึ้น
sort()
ออบเจ็กต์ คือวิธี Arrays
การเรียน และการรวบรวมวัตถุในรูปแบบของรายการก็เป็นวิธีการเรียนที่คล้ายCollections
กัน ในการเรียงลำดับโดยใช้วิธีการเหล่านี้ นักพัฒนา Java ให้อิสระแก่เราในการเลือกวิธีระบุเกณฑ์การเรียงลำดับ: โดยการใช้อินเทอร์เฟซComparable
ในคลาสของออบเจ็กต์ที่เราต้องการเรียงลำดับ หรือโดยใช้ไฟล์Comparator
. ในกรณีแรก วิธีการเรียงลำดับจะยอมรับชุดของวัตถุในรูปแบบของอาร์เรย์หรือรายการ:
sort(T[]array)//sorting массива
sort(List<T> list)// sorting списка
และในวินาที - บวกกับการใช้งานอินเทอร์เฟซอื่นComparator
:
sort(T[]array, Comparator <? super T> comparator)//sorting массива
sort(List<T> list, Comparator <? super T> comparator)// sorting списка
อินเทอร์เฟซComparable
ถูกใช้เมื่อเราต้องการตั้งค่าลำดับของวัตถุที่เป็นธรรมชาติ (สมเหตุสมผลที่สุดจากมุมมองของเรา) เมื่อทำการเรียงลำดับ นอกจากนี้ยังเป็นวิธีการ "ฮาร์ดไวร์" อัลกอริธึมสำหรับการเปรียบเทียบออบเจ็กต์ของคลาสนี้ในขั้นตอนการออกแบบ ตัวอย่างเช่น การใช้อินเทอร์เฟซนี้จะมีการกำหนดเกณฑ์สำหรับการเรียงลำดับตามธรรมชาติในคลาส wrapper ของประเภทดั้งเดิมหลัก: , , Byte
, Character
, Long
, Integer
, Short
, Double
, Float
, นอกจากนี้ยังหมายความว่าคลาสเหล่านี้มีวิธีการนำไปใช้ซึ่งเราสามารถใช้ในโปรแกรมได้หากจำเป็น ลองดูตัวอย่างการเปรียบเทียบสตริงเพื่อดูว่าวิธีนี้ถูกนำมาใช้ในชั้นเรียนอย่างไร Boolean
String
compareTo
String
String str1="Аарон";
String str2="АAPOH";
String str3="аарон";
String str4="ААрон";
String str5="аАрон";
String str6="Берта";
String str7="берта";
String[] allStr=new String[]{str1,str2,str3,str4, str5,str6, str7};
Arrays.sort(allStr);
for (String s:allStr){
System.out.println(s);
}
}
หากเรารันโค้ดนี้ด้วย method main
เราจะได้ผลลัพธ์ดังนี้:
АAPOH
ААрон
Аарон
Берта
аАрон
аарон
берта
ดังที่คุณเห็นในตัวอย่างในคลาสString
วิธีcompareTo
การจัดเรียงสตริงตามตัวอักษร พจนานุกรม และคำนึงถึงตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ มันเป็นลำดับของการเปรียบเทียบสตริงที่กำหนดโดยนักพัฒนาของคลาสString
ตามธรรมชาติ เพื่อให้เข้าใจได้ง่ายขึ้นว่าลำดับพจนานุกรมคืออะไร ก็เพียงพอแล้วที่จะจำได้ว่าจัดเรียงคำศัพท์ในพจนานุกรมภาษาอย่างไร เมื่อเปรียบเทียบตัวเลขวัตถุจะเรียงลำดับจากน้อยไปหามาก ตรรกะการเปรียบเทียบ นี้ ฝังอยู่ในคลาสByte
, Character
, Long
, Integer
, Shor
, Double
,Float
ลองใช้การเปรียบเทียบในชั้นเรียนของเรา
มาดูตัวอย่างวิธีที่คุณสามารถสร้างความสามารถในการเปรียบเทียบวัตถุในชั้นเรียนของคุณกัน เมื่อนำcompareto
เมธอด Java ไปใช้ เราสามารถระบุเกณฑ์ตั้งแต่หนึ่งเกณฑ์ขึ้นไปสำหรับการสั่งซื้ออ็อบเจ็กต์ และยังใช้เมธอดcompareto
จาก คลาส String
และInteger
ได้ ตัวอย่างเช่น สำหรับคลาสอ็อบเจ็กต์User
เราตั้งค่าการเรียงลำดับตามชื่อ และในกรณีที่ชื่อเท่ากัน ก็กำหนดตามอายุ วัตถุจะถูกจัดเรียงตามลำดับธรรมชาติ (เมื่อค่าเพิ่มขึ้น) ระดับUser
:
public class User implements Comparable <User>{//добавляем возможность сравнивать an objectы User
private String name;
private Integer age;
private String email;
public User(String name, int age, String email) {
this.name = name;
this.age = age;
this.email = email;
}
@Override
//реализуем метод compareTo интерфейса Comparable
public int compareTo(User o) {
//используем метод compareTo из класса String для сравнения имен
int result = this.name.compareTo(o.name);
//если имена одинаковые - сравниваем возраст,
используя метод compareTo из класса Integer
if (result == 0) {
result = this.age.compareTo(o.age);
}
return result;
}
@Override
public String toString() {
return "{" +
"name='" + name + '\'' +
", age=" + age +
", email='" + email + '\'' +
'}';
}
มาทดสอบการทำงานของวิธีการcompareTo
ที่นำมาใช้ในชั้นเรียนUser
โดยใช้ วิธี sort
การเรียนCollections
:
public static void main(String[] args) {
User user = new User("Andrey", 19, "andryha@mail.ru");
User user2 = new User("Олег", 25, "oleg@mail.ru");
User user3 = new User("Andrey", 24,"opr@google.com");
User user4 = new User("Igor", 16, "igor@mail.ru");
User user5 = new User("Andrey", 44,"stary@google.com");
List<User> list = new ArrayList<>();
list.add(user);
list.add(user2);
list.add(user3);
list.add(user4);
list.add(user5);
System.out.println("-------до сортировки--------");
for (User u : list) {
System.out.println(u);
}
System.out.println("-------после сортировки-----");
Collections.sort(list);
for (User u : list) {
System.out.println(u);
}
}
}
}
ผลลัพธ์ของวิธีการmain
:
-------до сортировки--------
{name='Андрей', age=19, email='andryha@mail.ru'}
{name='Олег', age=25, email='oleg@mail.ru'}
{name='Андрей', age=24, email='opr@google.com'}
{name='Игорь', age=16, email='igor@mail.ru'}
{name='Андрей', age=44, email='stary@google.com'}
-------после сортировки-----
{name='Андрей', age=19, email='andryha@mail.ru'}
{name='Андрей', age=24, email='opr@google.com'}
{name='Андрей', age=44, email='stary@google.com'}
{name='Игорь', age=16, email='igor@mail.ru'}
{name='Олег', age=25, email='oleg@mail.ru'}
เอาล่ะ เรามาสรุปกัน หากคุณเป็นผู้สนับสนุนความสงบเรียบร้อยในทุกสิ่ง และต้องการจัดเรียงอ็อบเจ็กต์ของคุณในอาร์เรย์หรือรายการโดยไม่มีโค้ดที่ไม่จำเป็น ให้ใช้อินเทอร์เฟComparable
ซ การใช้เมธอด comparisonTo ทำให้ง่ายต่อการสร้างกลไกสำหรับการเรียงลำดับอ็อบเจ็กต์ตามธรรมชาติในชั้นเรียนของคุณ หากคุณต้องทำงานกับคอลเลกชันและอาร์เรย์ของอ็อบเจ็กต์ของคลาสมาตรฐานที่อธิบายไว้ในไลบรารี Java ให้ใช้การใช้งานสำเร็จรูปcompareTo
ในคลาสเหล่านี้
GO TO FULL VERSION