【发布时间】:2014-06-12 19:15:13
【问题描述】:
我浏览了有关比较器和可比性如何工作的教程,但我对以下内容感到困惑:ComparatorMain 类调用
Collections.sort(listOfCountries,new Comparator<Country>() {
@Override
public int compare(Country o1, Country o2) {
return o1.getCountryName().compareTo(o2.getCountryName());
}
});
但是 compareTo() 方法的逻辑似乎是按 countryId 进行比较,而不是 countryName:
package org.arpit.javapostsforlearning;
//If this.cuntryId < country.countryId:then compare method will return -1
//If this.countryId > country.countryId:then compare method will return 1
//If this.countryId==country.countryId:then compare method will return 0
public class Country implements Comparable{
int countryId;
String countryName;
public Country(int countryId, String countryName) {
super();
this.countryId = countryId;
this.countryName = countryName;
}
@Override
public int compareTo(Object arg0) {
Country country=(Country) arg0;
return (this.countryId < country.countryId ) ? -1: (this.countryId > country.countryId ) ? 1:0 ;
}
public int getCountryId() {
return countryId;
}
public void setCountryId(int countryId) {
this.countryId = countryId;
}
public String getCountryName() {
return countryName;
}
public void setCountryName(String countryName) {
this.countryName = countryName;
}
}
那么这怎么可能起作用呢?
这是整个 ComparatorMain 类:
package org.arpit.javapostsforlearning;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public class ComparatorMain {
/**
* @author Arpit Mandliya
*/
public static void main(String[] args) {
Country indiaCountry=new Country(1, 'India');
Country chinaCountry=new Country(4, 'China');
Country nepalCountry=new Country(3, 'Nepal');
Country bhutanCountry=new Country(2, 'Bhutan');
List<Country> listOfCountries = new ArrayList<Country>();
listOfCountries.add(indiaCountry);
listOfCountries.add(chinaCountry);
listOfCountries.add(nepalCountry);
listOfCountries.add(bhutanCountry);
System.out.println('Before Sort by id : ');
for (int i = 0; i < listOfCountries.size(); i++) {
Country country=(Country) listOfCountries.get(i);
System.out.println('Country Id: '+country.getCountryId()+'||'+'Country name: '+country.getCountryName());
}
Collections.sort(listOfCountries,new CountrySortByIdComparator());
System.out.println('After Sort by id: ');
for (int i = 0; i < listOfCountries.size(); i++) {
Country country=(Country) listOfCountries.get(i);
System.out.println('Country Id: '+country.getCountryId()+'|| '+'Country name: '+country.getCountryName());
}
//Sort by countryName
Collections.sort(listOfCountries,new Comparator<Country>() {
@Override
public int compare(Country o1, Country o2) {
return o1.getCountryName().compareTo(o2.getCountryName());
}
});
System.out.println('After Sort by name: ');
for (int i = 0; i < listOfCountries.size(); i++) {
Country country=(Country) listOfCountries.get(i);
System.out.println('Country Id: '+country.getCountryId()+'|| '+'Country name: '+country.getCountryName());
}
}
}
教程: http://www.javacodegeeks.com/2013/03/difference-between-comparator-and-comparable-in-java.html
【问题讨论】:
-
我不明白你的问题。你能改写你的问题吗?
-
comparatorMain 类有一个 Collections.sort() 和一个具有 compare() 方法的匿名类。此 compare() 方法调用并返回来自 o1.getCountryName() 的 compareTo() 方法的结果,它只是一个字符串。 compareTo() 必须在一个类中实现,那么 String 如何使用它?唯一实现的 compareTo() 方法比较的是 countryID 而不是 countryName。我不明白什么?
标签: java interface compare comparator