需要根据值(登录时间)对自定义哈希映射进行排序

时间:2016-04-25 20:00:12

标签: java sorting dictionary

我在项目中使用struts,web service(rest)。

在我的动作类(下面命名为AdminMgmtAction)中,我通过使用rest API(getMdmServiceBO()。getLockBO()。getAllActiveUsers();)得到一个hashMap对象(activeUserMap),它存储在ActiveUserMap中,再次扩展了一个hashMap其键为String,值为ActiveUserVO,如下所示。我的要求是基于loggedInTime进行排序。

我尝试过使用比较器接口和linkedHashMap维护顺序,但它不起作用。任何人都可以建议我。

public class AdminMgmtAction extends BaseAction {
    public ActionForward showActiveUsers(ActionMapping mapping,ActionForm form, HttpServletRequest request,HttpServletResponse response) {
        dlog.debug("Executing showActiveUsers method in AdminMgmtAction...");
        ActionForward forward = null;
        AdminMgmtForm adminMgmtForm = (AdminMgmtForm) form;

        try {
            // get the active user map
            ActiveUserMap activeUserMap = getMdmServiceBO().getLockBO().getAllActiveUsers();
            //LinkedHashMap<String, ActiveUserVO> lm = new LinkedHashMap<String, ActiveUserVO>(activeUserMap);
            adminMgmtForm.setAllActiveUsersMap(activeUserMap);
            adminMgmtForm.setSelectedUidNSessId(null);

            return mapping.findForward(AdminConstants.SHOW_ACTIVE_USERS);
        } catch (Exception e) {
            flog.fatal("System Exception Occured: " + e.getMessage(), e);
            return mapping.findForward(MDMConstants.FAILURE);
        }
    }
}

public class ActiveUserMap extends LinkedHashMap<String, ActiveUserVO> {

    /**
     * Changed hashMap to LinkedHashMap
     */
    private static final long serialVersionUID = 2584709276177374330L;

    public ActiveUserMap() {
        super();
    }

}

public class ActiveUserVO implements Serializable, Comparable<ActiveUserVO>{
    /**
     * Implement comparable
     */
    private static final long serialVersionUID = -6501714930988894286L;

    private String sessionId;
    private int userId;
    private String username;
    private String firstName;
    private String lastName;
    private String emailAddress;
    private boolean aquiredLock;
    private Date loggedInTime;

    public Date getLoggedInTime() {
        return loggedInTime;
    }
    public void setLoggedInTime(Date loggedInTime) {
        this.loggedInTime = loggedInTime;
    }

    @Override
    public int compareTo(ActiveUserVO o) {
        // TODO Auto-generated method stub
        return o.getLoggedInTime().compareTo(this.loggedInTime);
    }
}

1 个答案:

答案 0 :(得分:2)

您可以使用java.util.TreeMap

这是一个基于红黑树的NavigableMap实现。地图根据其键的自然顺序进行排序,或者根据使用的构造函数在地图创建时提供的比较器进行排序...

创建将日期映射到TreeMap的{​​{1}}。假设您使用的Date对象已经实现了ActiveUserVO,那么您甚至不需要在ActiveUserVO类中编写自己的对象。

注意:您可能不需要这个额外的课程,但我会将声明放在您仍想使用它的情况下。

Comparable

相反,您可以遍历从API调用中返回的地图并将它们放入TreeMap中。

例如

public class ActiveUserMap extends TreeMap<Date, ActiveUserVO>
{
}