2016-04-25 37 views
1

我在我的項目中使用struts,web服務(其餘)。我使用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); 
    } 
} 

回答

2

您可以使用java.util.TreeMap

這是一個紅黑樹的基礎NavigableMap實現。該地圖是根據其鍵的自然順序進行排序,或者通過比較創建映射時提供的,這取決於使用的構造......

創建TreeMap映射重要日期ActiveUserVO。假設您使用的Date對象已經實現了Comparable,那麼您甚至不需要在ActiveUserVO類中編寫自己的。

注意:你可能不需要這個額外的類,但是我把這個聲明放在你還想使用它的情況下。

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

取而代之,您只需遍歷從API調用中獲取的映射並將它們放置到TreeMap中即可。

例如

// create a sorted map 
TreeMap<Date, ActiveUserVO> sortedMap = new TreeMap<Date, ActiveUserVO>(); 

// get the active user map 
ActiveUserMap activeUserMap = getMdmServiceBO().getLockBO().getAllActiveUsers(); 

// Iterate through the keys of the activeUserMap 
// I don't know the exact implementation of this map - hence the pseudocode 
for (each key in activeUserMap) 
{ 
    ActiveUserVO auVO = activeUserMap.get(key); 
    sortedMap.put(auVO.getDate(), auVO); 
} 
+0

完美!!邁克爾,它的作品,我真的很感謝你的幫助。 日期按降序排列我剛纔修改如下 NavigableMap nMap = sortedMap.descendingMap(); 再次感謝。 –