Java5-开发支持类库(Arrays类、Comparable、Comparator)

比较器:进行大小关系的判断;

1、Arrays类

  • 数组排序:java.util.Arrays.sort();
  • 二分查找法:public static int binarySearch(数据类型[] a, 数据类型 key)
    前提:数组必须是排序后的
public class TestDemo {
    public static void main(String args[]) {
        int data [] = new int [] {1, 5, 6, 2, 3, 4, 9, 8, 7, 10}; 
        java.util.Arrays.sort(data);  // 进行排序
        System.out.println(Arrays.binarySearch(data, 9)); //8
    }
}
  • 数组比较:public static boolean equals(数据类型[] a, 数据类型[] a2)
    判断数组是否相同,需要顺序完全一致
public class TestDemo {
    public static void main(String args[]) {
        int dataA [] = new int [] {1, 2, 3}; 
        int dataB [] = new int [] {2, 1, 3}; 
        int dataC [] = new int [] {1, 2, 3}; 
        System.out.println(Arrays.equals(dataA, dataB));//false
        System.out.println(Arrays.equals(dataA, dataC));//true
    }
}

2、Comparable比较器

public class Book {
    private String title;
    private double price;
    public Book(String title, double price) {
    this.title = title;
    this.price = price;
    }
    public String to String() {
        return "书名:" + this.title + " 价格:" + this.price;
    }
}

public class TestDemo {
    public static void main(String args[]) {
        Book books [] = new Book [] {
                new Book("Java开发", 79.8), 
                new Book("JSP开发", 69.8), 
                new Book("Oracle开发", 99.8), 
                new Book("Android开发", 89.8), 
        };
        Arrays.sort(books);  // 对象数组排序
        System.out.println(Arrays.toString(books));
    }
}

执行结果

Exception in thread "main" java.lang.ClassCastExceptionBook cannot be cast to java.lang.Comparable...

两个没有关系的类对象发生了强制性的转换。对象数组包含的编码(地址)比较是没意义的,应该按照价格排序才是有意义的,所以此处必须要明确设置出比较规则。

Comparable接口定义

public interface Comparable<T> {
    public int compareTo(T o);
}

compareTo()方法返回三类数据:1(大于)、0(等于)、-1(小于)。

public class Book implements Comparable<Book> {  // 实现比较
    private String title;
    private double price;
    public Book(String title, double price) {
    this.title = title;
    this.price = price;
    }
    @Override
    public String to String() {
        return "书名:" + this.title + " 价格:" + this.price;
    }
    @Override
    public int compareTo(Book o) {  // Arrays.sort()会自动调用此方法比较
        if(this.price > o.price) {
            return 1;
        } else if(this.price < o.price) {
            return -1;
        } else {
            return 0;
        }
    }
}

public class TestDemo {
    public static void main(String args[]) {
        Book books [] = new Book [] {
                new Book("Java开发", 79.8), 
                new Book("JSP开发", 69.8), 
                new Book("Oracle开发", 99.8), 
                new Book("Android开发", 89.8), 
        };
        Arrays.sort(books);  // 对象数组排序
        System.out.println(Arrays.toString(books));
        //[书名:JSP开发 价格:69.8, 书名:Java开发 价格:79.8, 书名:Android开发 价格:89.8, 书名:Oracle开发 价格:99.8]
    }
}

compareTo()方法由Arrays.sort()自动进行调用。

不管何种情况下,只要是一组对象要排序,对象所在的类一定要实现Comparable接口。

3、Comparator比较器

  • 在不修改Book类定义的情况下不能使用Comparable接口,又出现了另一个比较器:java.util.Comparator。
  • 要实现的只有compare()方法,需要单独准备出一个类来实现Comparator接口,这个类将作为指定类的排序类。
    定义排序工具类
public class BookComparator implements Comparator<Book> {
    @Override
    public int compare(Book o1, Book o2) {
        if(o1.getPrice() > o2.getPrice()) {
            return 1;
        } else if(o1.getPrice() < o2.getPrice()) {
            return -1;
        } else {
            return 0;
        }
    }
}

使用排序工具类

public class TestDemo {
    public static void main(String args[]) {
        Book books [] = new Book [] {
                new Book("Java开发", 79.8), 
                new Book("JSP开发", 69.8), 
                new Book("Oracle开发", 99.8), 
                new Book("Android开发", 89.8), 
        };
        Arrays.sort(books, new BookComparator());  // 对象数组排序
        System.out.println(Arrays.toString(books));
    }
}

比较Comparable和Comparator的区别:

ComparableComparator
java.lang.Comparablejava.util.Comparator
类定义的时候实现专门定义比较工具类
int compareTo()compare()、equals()
大多数使用使用较少
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值