Comparable和Comparator的理解

首先我们看以一下各自的JDK源码: 
在jdk1.8版本中Comparable接口仍然只有一个方法:compareTo ;

在jdk1.8版本中Comparator接口中增加了许多方法,接口也用了1.8才加进来的@FunctionalInterface注解。

Comparable的用法

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class Employee implements Comparable<Employee> {
    /**
     * id是根据进入公司的先后顺序排序
     */
    private int id;

    /**
     * 姓名
     */
    private String name;

    /**
     * 职位
     */
    private String position;

    public Employee(int id, String name, String position) {
        this.id = id;
        this.name = name;
        this.position = position;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPosition() {
        return position;
    }

    public void setPosition(String position) {
        this.position = position;
    }

    @Override
    public String toString() {
        return "id[" + id + "],name[" + name + "],position[" + position + "]";
    }

    @Override
    public int compareTo(Employee o) {
        if (this.getId() > o.getId()) {
            return 1;
        } else if (this.getId() < o.getId()) {
            return -1;
        } else {
            return 0;
        }
    }

    public static void main(String[] args) {
        List<Employee> list = new ArrayList<>();

        list.add(new Employee(10001, "张三", "Boss"));
        list.add(new Employee(10006, "赵四", "Manager"));
        list.add(new Employee(10035, "王五", "Manager"));
        list.add(new Employee(10002, "李六", "staff"));
        list.add(new Employee(10005, "马牛", "staff"));
        // 按照id排序
        Collections.sort(list);
        // 如果要实现倒叙则调用下面的方法
        //Collections.reverse(list);
        for (Employee e : list) {
            System.out.println(e + "id:" + e.getId());
        }
    }
}

输出:

id[10001],name[张三],position[Boss]id:10001
id[10002],name[李六],position[staff]id:10002
id[10005],name[马牛],position[staff]id:10005
id[10006],name[赵四],position[Manager]id:10006
id[10035],name[王五],position[Manager]id:10035

Comparator的用法

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public class EmployComparator implements Comparator<EmployComparator> {
    /**
     * id是根据进入公司的先后顺序排序
     */
    private int id;

    /**
     * 姓名
     */
    private String name;

    /**
     * 职位
     */
    private String position;

    public EmployComparator() {

    }

    public EmployComparator(int id, String name, String position) {
        this.id = id;
        this.name = name;
        this.position = position;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPosition() {
        return position;
    }

    public void setPosition(String position) {
        this.position = position;
    }

    @Override
    public int compare(EmployComparator o1, EmployComparator o2) {
        if (o1.getId() > o2.getId()) {
            return 1;
        } else if (o1.getId() < o2.getId()) {
            return -1;
        } else {
            return 0;
        }
    }

    public static void main(String[] args) {
        List<EmployComparator> list = new ArrayList<EmployComparator>();

        list.add(new EmployComparator(1001, "张三", "Boss"));
        list.add(new EmployComparator(1006, "赵四", "Manager"));
        list.add(new EmployComparator(10035, "王五", "Manager"));
        list.add(new EmployComparator(1002, "李六", "staff"));
        list.add(new EmployComparator(1005, "马牛", "staff"));
        // 按照id排序,也就是按照资历深浅排序,需要构造器
        Collections.sort(list, new EmployComparator());
        // 倒叙
        //Collections.reverse(list);
        for (EmployComparator e : list) {
            System.out.println(e + "id:" + e.getId());
        }
    }
}

output:

id[1001],name[张三],position[Boss]id:1001
id[1002],name[李六],position[staff]id:1002
id[1005],name[马牛],position[staff]id:1005
id[1006],name[赵四],position[Manager]id:1006
id[10035],name[王五],position[Manager]id:10035

未完待续...

2019.5.20更新:

// 修改Employee排序
Comparator<Employee> comparator = new Comparator<Employee>() {
    @Override
    public int compare(Employee o1, Employee o2) {
        if(o1.getName().hashCode() > o2.getName().hashCode()){
            return 1;
        }else if(o1.getName().hashCode() < o2.getName().hashCode()){
            return -1;
        }else {
            return 0;
        }
    }
};
// 指定比较器
Collections.sort(list,comparator);
for (Employee e : list) {
    System.out.println(e + "id:" + e.getId());
}

output:
d[10001],name[张三],position[Boss]id:10001
id[10002],name[李六],position[staff]id:10002
id[10035],name[王五],position[Manager]id:10035
id[10006],name[赵四],position[Manager]id:10006
id[10005],name[马牛],position[staff]id:10005

总结

  • Comparable 自然排序。(实体类实现)
  • Comparator 是定制排序。(无法修改实体类时,直接在调用方创建)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个能够实现上述要求的Java程序,其中涉及到类的抽象与继承、方法重写和重载、多态性、排序等面向对象编程的概念: ```java import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.Scanner; abstract class Contact { private String name; private String phone; private String remark; public Contact(String name, String phone, String remark) { this.name = name; this.phone = phone; this.remark = remark; } public abstract String getInfo(); public void display() { System.out.println(getInfo()); } public String toString() { return getInfo(); } public String getName() { return name; } public String getPhone() { return phone; } public String getRemark() { return remark; } } class FamilyContact extends Contact { private String address; private String homePhone; public FamilyContact(String name, String phone, String remark, String address, String homePhone) { super(name, phone, remark); this.address = address; this.homePhone = homePhone; } public String getInfo() { return "家人 - " + getName() + " " + getPhone() + " " + getRemark() + " " + address + " " + homePhone; } } class FriendContact extends Contact { private String category; public FriendContact(String name, String phone, String remark, String category) { super(name, phone, remark); this.category = category; } public String getInfo() { return "朋友 - " + getName() + " " + getPhone() + " " + getRemark() + " " + category; } } class WorkContact extends Contact { private String company; private String department; private String position; public WorkContact(String name, String phone, String remark, String company, String department, String position) { super(name, phone, remark); this.company = company; this.department = department; this.position = position; } public String getInfo() { return "工作联系人 - " + getName() + " " + getPhone() + " " + getRemark() + " " + company + " " + department + " " + position; } } class PhoneBook { private ArrayList<Contact> contacts; public PhoneBook() { contacts = new ArrayList<Contact>(); } public void addContact(Contact contact) { contacts.add(contact); } public void removeContact(Contact contact) { contacts.remove(contact); } public void modifyContact(Contact oldContact, Contact newContact) { int index = contacts.indexOf(oldContact); contacts.set(index, newContact); } public Contact searchContact(String name) { for (Contact contact : contacts) { if (contact.getName().equals(name)) { return contact; } } return null; } public void displayContacts() { for (Contact contact : contacts) { contact.display(); } } public void sortContacts() { Collections.sort(contacts, new Comparator<Contact>() { public int compare(Contact c1, Contact c2) { return c1.getName().compareToIgnoreCase(c2.getName()); } }); } } public class Main { public static void main(String[] args) { PhoneBook phoneBook = new PhoneBook(); Scanner scanner = new Scanner(System.in); while (true) { System.out.println("请输入要进行的操作:1.添加联系人 2.删除联系人 3.修改联系人 4.查找联系人 5.显示所有联系人 6.排序联系人"); int option = scanner.nextInt(); switch (option) { case 1: System.out.println("请输入联系人类型:1.家人 2.朋友 3.工作联系人"); int type = scanner.nextInt(); System.out.println("请输入姓名:"); String name = scanner.next(); System.out.println("请输入电话:"); String phone = scanner.next(); System.out.println("请输入备注:"); String remark = scanner.next(); if (type == 1) { System.out.println("请输入地址:"); String address = scanner.next(); System.out.println("请输入固定电话:"); String homePhone = scanner.next(); FamilyContact familyContact = new FamilyContact(name, phone, remark, address, homePhone); phoneBook.addContact(familyContact); } else if (type == 2) { System.out.println("请输入类别:"); String category = scanner.next(); FriendContact friendContact = new FriendContact(name, phone, remark, category); phoneBook.addContact(friendContact); } else if (type == 3) { System.out.println("请输入公司:"); String company = scanner.next(); System.out.println("请输入部门:"); String department = scanner.next(); System.out.println("请输入职务:"); String position = scanner.next(); WorkContact workContact = new WorkContact(name, phone, remark, company, department, position); phoneBook.addContact(workContact); } break; case 2: System.out.println("请输入要删除的联系人姓名:"); String nameToRemove = scanner.next(); Contact contactToRemove = phoneBook.searchContact(nameToRemove); if (contactToRemove != null) { phoneBook.removeContact(contactToRemove); System.out.println("删除成功!"); } else { System.out.println("联系人不存在!"); } break; case 3: System.out.println("请输入要修改的联系人姓名:"); String nameToModify = scanner.next(); Contact contactToModify = phoneBook.searchContact(nameToModify); if (contactToModify != null) { System.out.println("请输入新的联系人信息:"); int typeToModify = 0; if (contactToModify instanceof FamilyContact) { typeToModify = 1; } else if (contactToModify instanceof FriendContact) { typeToModify = 2; } else if (contactToModify instanceof WorkContact) { typeToModify = 3; } System.out.println("请输入姓名:"); String newName = scanner.next(); System.out.println("请输入电话:"); String newPhone = scanner.next(); System.out.println("请输入备注:"); String newRemark = scanner.next(); if (typeToModify == 1) { System.out.println("请输入地址:"); String newAddress = scanner.next(); System.out.println("请输入固定电话:"); String newHomePhone = scanner.next(); FamilyContact newFamilyContact = new FamilyContact(newName, newPhone, newRemark, newAddress, newHomePhone); phoneBook.modifyContact(contactToModify, newFamilyContact); } else if (typeToModify == 2) { System.out.println("请输入类别:"); String newCategory = scanner.next(); FriendContact newFriendContact = new FriendContact(newName, newPhone, newRemark, newCategory); phoneBook.modifyContact(contactToModify, newFriendContact); } else if (typeToModify == 3) { System.out.println("请输入公司:"); String newCompany = scanner.next(); System.out.println("请输入部门:"); String newDepartment = scanner.next(); System.out.println("请输入职务:"); String newPosition = scanner.next(); WorkContact newWorkContact = new WorkContact(newName, newPhone, newRemark, newCompany, newDepartment, newPosition); phoneBook.modifyContact(contactToModify, newWorkContact); } System.out.println("修改成功!"); } else { System.out.println("联系人不存在!"); } break; case 4: System.out.println("请输入要查找的联系人姓名:"); String nameToSearch = scanner.next(); Contact contactToSearch = phoneBook.searchContact(nameToSearch); if (contactToSearch != null) { contactToSearch.display(); } else { System.out.println("联系人不存在!"); } break; case 5: phoneBook.displayContacts(); break; case 6: phoneBook.sortContacts(); System.out.println("排序成功!"); break; default: System.out.println("输入错误,请重新输入!"); break; } } } } ``` 这个程序实现了添加、删除、修改、查找和显示所有联系人信息的功能,并提供了一个排序联系人的选项。在程序运行时,用户可以根据提示输入相应的操作,然后程序会根据用户输入的内容执行相应的操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值