[英]Sorting with TreeMap and TreeSet not syncronized
我在排序兩個組件時遇到問題,不知道為什么。
我創建一個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 );
第二部分將結果放入對象
/**
* 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結合使用?
您已經在代碼中使用了HashMap
,但未保留HashMap
文檔中提到的項目順序
此類無法保證地圖的順序。 特別是,它不能保證順序會隨着時間的推移保持恆定。
使用LinkedHashMap
保留項目的順序,它應該可以解決您的問題
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.