因工作中需要经常对对象进行排序的场景,抽时间就写了个小例子,用的guava Ordering技术
不用多介绍很简单,干货,直接上代码
1.创建待排序类 User
/**
*
*/
package com.wcg.vo;
import java.util.Date;
/**
* @author Jalen
*
*/
@SuppressWarnings("serial")
public class User extends VoSerde {
private Integer id;
private String name;
private Date birthday;
/**
* 职业信息
*/
private Profession profession;
/**
* 配偶
*/
private Spouse spouse;
public User() {
}
public User(Integer id, String name, Date birthday, Profession profession, Spouse spouse) {
super();
this.id = id;
this.name = name;
this.birthday = birthday;
this.profession = profession;
this.spouse = spouse;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public Profession getProfession() {
return profession;
}
public void setProfession(Profession profession) {
this.profession = profession;
}
public Spouse getSpouse() {
return spouse;
}
public void setSpouse(Spouse spouse) {
this.spouse = spouse;
}
}
2.创建 Profession 类
/**
*
*/
package com.wcg.vo;
/**
* @author Jalen
*
*/
@SuppressWarnings("serial")
public class Profession extends VoSerde {
private String profName;
private Integer profLevel;
public Profession() {
super();
}
public Profession(String profName, Integer profLevel) {
super();
this.profName = profName;
this.profLevel = profLevel;
}
public String getProfName() {
return profName;
}
public void setProfName(String profName) {
this.profName = profName;
}
public Integer getProfLevel() {
return profLevel;
}
public void setProfLevel(Integer profLevel) {
this.profLevel = profLevel;
}
}
3.创建 Spouse 类
/**
*
*/
package com.wcg.vo;
/**
* @author Jalen
*
*/
@SuppressWarnings("serial")
public class Spouse extends VoSerde {
private String name;
private Integer age;
public Spouse() {
}
public Spouse(String name, Integer age) {
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
4.创建比较器 UserComparator
/**
*
*/
package com.wcg.comparator;
import java.util.Comparator;
import com.google.common.primitives.Ints;
import com.wcg.vo.User;
/**
* @author Jalen
*
*/
public class UserComparator implements Comparator<User> {
@Override
public int compare(User user0, User user1) {
return Ints.compare(user0.getId(), user1.getId());
}
}
5.创建比较器 UserSpouseComparator 类
/**
*
*/
package com.wcg.comparator;
import java.util.Comparator;
import com.wcg.vo.User;
/**
* @author Jalen
*
*/
public class UserSpouseComparator implements Comparator<User> {
@Override
public int compare(User user1, User user2) {
//return user1.getSpouse().getName().compareToIgnoreCase(user2.getSpouse().getName());
return user1.toString().compareTo(user2.toString());
}
}
6.创建测试用例 TestUserOrder运行 userOrderTest方法就执行对象排序
/**
*
*/
package com.wcg.order;
import static org.junit.Assert.fail;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import org.junit.Test;
import com.google.common.collect.Lists;
import com.google.common.collect.Ordering;
import com.wcg.comparator.UserComparator;
import com.wcg.comparator.UserSpouseComparator;
import com.wcg.vo.Profession;
import com.wcg.vo.Spouse;
import com.wcg.vo.User;
/**
* @author Jalen
*
*/
public class TestUserOrder {
@Test
public void test() {
fail("Not yet implemented");
}
@Test
public void userOrderTest() {
Spouse spouse1 = new Spouse("小芳", 28);
Profession profession1 = new Profession("技术部", 10);
User user1 = new User(1, "小王", new Date(), profession1, spouse1);
Spouse spouse2 = new Spouse("小芳2", 28);
Profession profession2 = new Profession("技术部2", 10);
User user2 = new User(2, "小王", new Date(), profession2, spouse1);
Spouse spouse3 = new Spouse("小芳3", 28);
Profession profession3 = new Profession("技术部3", 10);
User user3 = new User(3, "小王", new Date(), profession3, spouse2);
Spouse spouse4 = new Spouse("小芳4", 28);
Profession profession4 = new Profession("技术部4", 10);
User user4 = new User(4, "小王", new Date(), profession4, spouse4);
Spouse spouse44 = new Spouse("小芳44", 28);
Profession profession44 = new Profession("技术部44", 10);
User user44 = new User(4, "小王", new Date(), profession44, spouse44);
Spouse spouse5 = new Spouse("小芳5", 28);
Profession profession5 = new Profession("技术部5", 10);
User user5 = new User(5, "小王", new Date(), profession5, spouse3);
List<User> users = Lists.newArrayList(user1, user2, user3, user4, user44, user5);
UserComparator userComparator = new UserComparator();
UserSpouseComparator userSpouseComparator = new UserSpouseComparator();
Ordering<User> userOrder = Ordering.from(userComparator).reverse().compound(userSpouseComparator).reverse();
Collections.sort(users, userOrder);
users.forEach(user -> System.out.println(user.toString()));
}
}
7.运行结果为
8. User, Spouse, Profession用到了 VoSerde
/**
*
*/
package com.wcg.vo;
import java.io.Serializable;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
/**
* @author Jalen
*
*/
@SuppressWarnings("serial")
public class VoSerde implements Serializable {
@Override
public String toString() {
return ToStringBuilder.reflectionToString(this);
}
public String toJson() {
return ToStringBuilder.reflectionToString(this, ToStringStyle.JSON_STYLE);
}
}