2017-04-21 59 views
1

我在排序两个组件时遇到问题,并且看不到原因。使用TreeMap和TreeSet进行排序不同步

我创建这样一个SortedMap:

private static SortedMap<String, String> getMapping(List<LdapMapping> mapping) 
    { 
    SortedMap<String, String> fieldMapping = new TreeMap<>(); 
    for (LdapMapping map : mapping) 
    { 
     fieldMapping.put(map.getInternalField(), map.getLdapField()); 
    } 
    return fieldMapping; 
    } 

也看在生成JSON好:

"head": [ 
    "emailAddress", 
    "enabled", 
    "firstName", 
    "lastName", 
    "name" 
    ], 

后来我用这个的SortedMap创建JSON这样的第二部分:

/** 
    * Gets the field values from only ldap. 
    * 
    * @param entry the entry 
    * @param mapping the mapping 
    * @return the field values 
    */ 
    private static Map<String, Boolean> getFieldValues(SearchResultEntry entry, Map<String, String> mapping) 
    { 
    SortedSet<String> keys = new TreeSet<>(mapping.keySet()); 
    Map<String, Boolean> fields = new HashMap<>(); 

    for (String key : keys) 
    { 
     String ldapField = mapping.get(key); 
     String ldapValue = entry.getAttributeValue(ldapField); 
     fields.put(ldapValue, Boolean.FALSE); 
    } 

    return fields; 
    } 

    ldapUser.setFields(getFieldValues(entry, fieldMapping)); 
    ldapUser.setAction(IMPORT_STATUS_NEW); 

第二部分结果get放入对象

/** 
* The Class LdapUserImpl. 
*/ 
public class LdapUserImpl implements LdapUser 
{ 

    /** The Constant serialVersionUID. */ 
    private static final long serialVersionUID = 1L; 

    /** The action. */ 
    private String action; 

    /** The fields. */ 
    private transient Map<String, Boolean> fields; 

    public LdapUserImpl() 
    { 
    /* nothing special needed */ 
    } 

    /** {@inheritDoc} */ 
    @Override 
    public String getAction() 
    { 
    return action; 
    } 

    /** {@inheritDoc} */ 
    @Override 
    public Map<String, Boolean> getFields() 
    { 
    return fields; 
    } 

    /** {@inheritDoc} */ 
    @Override 
    public void setAction(String action) 
    { 
    this.action = action; 
    } 

    /** {@inheritDoc} */ 
    @Override 
    public void setFields(Map<String, Boolean> data) 
    { 
    this.fields = data; 
    } 

} 

的JSON,这部分则是这样的:

"data": [ 
    { 
     "action": "New User", 
     "fields": { 
     "emailAddress": false, 
     "lastName": false, 
     "firstName": false, 
     "enabled": false, 
     "name": false 
     } 
    }, 
    { 
     "action": "New User", 
     "fields": { 
     "emailAddress": false, 
     "enabled": false, 
     "firstname": false, 
     "name": false, 
     "lastname": false 
     } 
    }, 

正如你所看到的,它们不匹配,因为我想在第二部分中的值匹配的顺序在JSON像这样的第一部分:

"head": [ 
    "emailAddress", 
    "enabled", 
    "firstName", 
    "lastName", 
    "name" 
    ], 
    "data": [ 
    { 
     "action": "New User", 
     "fields": { 
     "emailAddress": false, 
     "enabled": false, 
     "firstname": false, 
     "lastname": false, 
     "name": false 
     } 
    }, 
    { 
     "action": "New User", 
     "fields": { 
     "emailAddress": false, 
     "enabled": false, 
     "firstname": false, 
     "lastname": false, 
     "name": false 
     } 
    }] 

注:我自然取代了真正的价值与获得画面上显示的字段。

创建第二部分的问题在哪里? 是否因为我使用SortedSet与SortedMap组合不正确?

+0

你是如何转换成JSON? – slim

+0

对杰克逊使用标准配置 – Nico

+0

是否由于使用了不保留项目顺序的“HashMap”?也许尝试使用'LinkedHashMap'并查看是否可以重现相同的结果 –

回答

2

你已经在你的代码中使用HashMap作为HashMapdocumentation

此类不保证为向地图的顺序提到这不保留项目的顺序;在 特别是,它不能保证该订单随着时间的推移将保持恒定 。

使用LinkedHashMap保留项目的顺序,它应该解决您的问题