题目:
地址类:
package api1_9作业;
import java.util.ArrayList;
public class Address {
private String name;
private String street;
private String city;
private String country;
private String pinCode;
/*
* 姓名、街道、市(县)、省(自治区)、国家(地区)和代码
*
* */
public Address(String name, String street, String city, String country, String pinCode) {
this.name = name;
this.street = street;
this.city = city;
this.country = country;
this.pinCode = pinCode;
}
public Address() {
super();
// TODO Auto-generated constructor stub
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getStreet() {
return street;
}
public void setStreet(String street) {
this.street = street;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public String getCountry() {
return country;
}
public void setCountry(String country) {
this.country = country;
}
public String getPinCode() {
return pinCode;
}
public void setPinCode(String pinCode) {
this.pinCode = pinCode;
}
/*5. 将第三题中的ArrayList实现排序。
a)提示:排序必须先实现该类对象能比较大小。
b)地址先按比较国家,相同则比较城市,再相同则比较街道,再相同则比较姓名
重写toString方法
*/
@Override
public String toString()
{
return "\nname:"+name+"\nstreet:"+street+"\ncity:"+city+"\ncountry:"+country+"\npinCode:"+pinCode+"\n";
}
}
实现比较:
package api1_9作业;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.Vector;
public class demo2 {
public static void main(String[] args) {
Address str1 = new Address("David Clarke","10 Downing Street","LondonState:London",
"United Kindom","110022");
Address str2 = new Address ("John Lenon","12 Park Avenue","CaliforniaState:California",
"USA ","210033");
Address str3 = new Address ("Stefii Graff","14 Maple lane","MahomaState:Sydney",
"Australia","412033");
ArrayList<Address> arr = new ArrayList<Address>();
arr.add(str1);
arr.add(str2);
arr.add(str3);
//比较器比较
Collections.sort(arr, new Comparator<Address>() {
/*b)地址先按比较国家,相同则比较城市,再相同则比较街道,再相同则比较姓名
* */
/* * Stefii Graff","14 Maple lane","Sydney", "Australia","412033"
* 姓名 街道 城市 国家 代码
* 地址先按比较国家,相同则比较城市,再相同则比较街道,再相同则比较姓名
* this.name = name;
this.street = street;
this.city = city;
this.country = country;
this.pinCode = pinCode;
都升序比较
* */
@Override
public int compare(Address o1, Address o2) {
/*
*
* */
int result = o1.getCountry().charAt(0)-o2.getCountry().charAt(0);//国家升序
if(o1.getCountry().equals(o2.getCountry())) {//如果国家相同 比较城市
result = o1.getCity().charAt(0)-o2.getCity().charAt(0);//城市升序
if(o1.getCity().equals(o2.getCity())) {//如果城市相同 比较街道
result = o1.getStreet().charAt(0)-o2.getStreet().charAt(0);
if(o1.getStreet().equals(o2.getStreet())) {//如果街道相同 比较姓名
result = o1.getName().charAt(0)-o2.getName().charAt(0);
}
}
}
return result;
}
});
System.out.println(arr.toString());
}
}
说到排序了,简单的说就是两个对象之间比较大小,那么在JAVA中提供了两种比较实现的方式,一种是比较死板的采用java.lang.Comparable
接口去实现,一种是灵活的当我需要做排序的时候在去选择的java.util.Comparator
接口完成。
那么我们采用的public static <T> void sort(List<T> list)
这个方法完成的排序,实际上要求了被排序的类型需要实现Comparable接口完成比较的功能,在String类型上如下:
public final class String implements java.io.Serializable, Comparable<String>, CharSequence {
String类实现了这个接口,并完成了比较规则的定义,但是这样就把这种规则写死了,那比如我想要字符串按照第一个字符降序排列,那么这样就要修改String的源代码,这是不可能的了,那么这个时候我们可以使用
public static <T> void sort(List<T> list,Comparator<? super T> )
方法灵活的完成,这个里面就涉及到了Comparator这个接口,位于位于java.util包下,排序是comparator能实现的功能之一,该接口代表一个比较器,比较器具有可比性!顾名思义就是做排序的,通俗地讲需要比较两个对象谁排在前谁排在后,那么比较的方法就是:
-
public int compare(String o1, String o2)
:比较其两个参数的顺序。两个对象比较的结果有三种:大于,等于,小于。
如果要按照升序排序,
则o1 小于o2,返回(负数),相等返回0,01大于02返回(正数)
如果要按照降序排序
则o1 小于o2,返回(正数),相等返回0,01大于02返回(负数)
如果在使用的时候,想要独立的定义规则去使用 可以采用Collections.sort(List list,Comparetor c)方式,自己定义规则:
Collections.sort(list, new Comparator<Student>() {
@Override
public int compare(Student o1, Student o2) {
return o2.getAge()-o1.getAge();//以学生的年龄降序
}
});