[英]Sorting of Arraylist using Collections.sort and comparetor
场景是我有移动公司的brand_name,model_no和价格 ,我必须根据移动公司的brand_name对其进行排序。 我正在使用Collections.sort进行自然排序,并使用比较器进行自定义排序,但是由于某些问题,此代码无法编译。 请任何人可以帮助我解决此问题
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
public class ArrayListSortingExample {
private static class SmartPhone implements Comparable {
private String brand;
private String model;
private int price;
public SmartPhone(String brand, String model, int price){
this.brand = brand;
this.model = model;
this.price = price;
}
@Override
public int compareTo(SmartPhone sp) {
return this.brand.compareTo(sp.brand);
}
@Override
public String toString() {
return "SmartPhone{" + "brand=" + brand + ", model=" + model + ", price=" + price + '}';
}
}
private static class PriceComparator implements Comparator{
@Override
public int compare(SmartPhone sp1, SmartPhone sp2) {
return (sp1.price < sp2.price ) ? -1: (sp1.price > sp2.price) ? 1:0 ;
}
}
public static void main(String... args) {
SmartPhone apple = new SmartPhone("Apple", "IPhone4S",1000);
SmartPhone nokia = new SmartPhone("Nokia", "Lumia 800",600);
SmartPhone samsung = new SmartPhone("Samsung", "Galaxy Ace",800);
SmartPhone lg = new SmartPhone("LG", "Optimus",500);
ArrayList Phones = new ArrayList();
Phones.add(apple);
Phones.add(nokia);
Phones.add(samsung);
Phones.add(lg);
Collections.sort(Phones);
System.out.println(Phones);
Collections.sort(Phones, new PriceComparator());
System.out.println(Phones);
}
}
输出应如下所示:
[SmartPhone{brand=Apple, model=IPhone4S, price=1000}, SmartPhone{brand=LG, model=Optimus, price=500}, SmartPhone{brand=Nokia, model=Lumia 800, price=600}, SmartPhone{brand=Samsung, model=Galaxy Ace, price=800}]
[SmartPhone{brand=LG, model=Optimus, price=500}, SmartPhone{brand=Nokia, model=Lumia 800, price=600}, SmartPhone{brand=Samsung, model=Galaxy Ace, price=800}, SmartPhone{brand=Apple, model=IPhone4S, price=1000}]
错误是
Exception in thread "main" java.lang.AbstractMethodError: employee.ArrayListSortingExample$SmartPhone.compareTo(Ljava/lang/Object;)I
at java.util.ComparableTimSort.countRunAndMakeAscending(ComparableTimSort.java:290)
at java.util.ComparableTimSort.sort(ComparableTimSort.java:157)
at java.util.ComparableTimSort.sort(ComparableTimSort.java:146)
at java.util.Arrays.sort(Arrays.java:472)
at java.util.Collections.sort(Collections.java:155)
at employee.ArrayListSortingExample.main(ArrayListSortingExample.java:37)
Comparable和Comparator都是通用接口,您应该通过放置“ implements Comparable <T>”来实现它们,其中T是您在compareTo方法中放置的类。 由于您尚未指定T,因此会将其视为Object,因此通过将SmartPhone用作compareTo中的参数,您实际上并没有使用通过实现Comparable约定使用的方法。 如果在代码中放置Comparable <SmartPhone>和Comparator <SmartPhone>,则您的代码应进行编译。
问题是SmartPhone
类实现Comparable
,但是compareTo
方法采用SmartPhone
类型的参数,并且compareTo
被声明为采用Object
。 您可以通过将SmartPhone
的compareTo
更改为以下内容来解决此问题:
@Override
public int compareTo(Object o) {
SmartPhone sp = (SmartPhone) o;
return this.brand.compareTo(sp.brand);
}
该代码之所以有效,是因为除非您犯了错误并将非SmartPhone
放入数组列表,否则永远不会使用SmartPhone
类型的参数来调用此方法。
使用泛型可以避免所有这些问题。 使用泛型,您的代码将变为:
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
public class ArrayListSortingExample {
private static class SmartPhone implements Comparable<SmartPhone> {
private String brand;
private String model;
private int price;
public SmartPhone(String brand, String model, int price){
this.brand = brand;
this.model = model;
this.price = price;
}
@Override
public int compareTo(SmartPhone sp) {
return this.brand.compareTo(sp.brand);
}
@Override
public String toString() {
return "SmartPhone{" + "brand=" + brand + ", model=" + model + ", price=" + price + '}';
}
}
private static class PriceComparator implements Comparator<SmartPhone> {
@Override
public int compare(SmartPhone sp1, SmartPhone sp2) {
return (sp1.price < sp2.price ) ? -1: (sp1.price > sp2.price) ? 1:0 ;
}
}
public static void main(String... args) {
SmartPhone apple = new SmartPhone("Apple", "IPhone4S",1000);
SmartPhone nokia = new SmartPhone("Nokia", "Lumia 800",600);
SmartPhone samsung = new SmartPhone("Samsung", "Galaxy Ace",800);
SmartPhone lg = new SmartPhone("LG", "Optimus",500);
ArrayList<SmartPhone> Phones = new ArrayList<SmartPhone>();
Phones.add(apple);
Phones.add(nokia);
Phones.add(samsung);
Phones.add(lg);
Collections.sort(Phones);
System.out.println(Phones);
Collections.sort(Phones, new PriceComparator());
System.out.println(Phones);
}
}
有关泛型的完整说明,请参见《 泛型Java教程》 。
您应该将implements Comparable
替换为Comparable<SmartPhone>
,并将implements Comparator
替换为Comparator<SmartPhone>
。 比较器和可比较接口使用泛型。 因此,您需要指定要比较的类型。
而且ArrayList Phones = new ArrayList();
不好,因为您使用的是原始类型和错误的名称(大写表示类)。 替换为ArrayList<SmartPhone> phones = new ArrayList<SmartPhone>();
。 泛型非常有用,可以防止您在运行时强制抛出异常。 如果您使用的是JAVA SE 7,请使用菱形运算符ArrayList<SmartPhone> phones = new ArrayList<>();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.