guava Ordering复杂对象排序例子

因工作中需要经常对对象进行排序的场景,抽时间就写了个小例子,用的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.运行结果为

140233_WLhb_3213541.png

 

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);
    }

}
 

 

转载于:https://my.oschina.net/u/3213541/blog/878693

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值