2017-04-21 5 views
1

Ich habe ein Problem beim Sortieren von zwei Komponenten und sehe nicht warum.Sortierung mit TreeMap und TreeSet nicht synchronisiert

erstelle ich eine SortedMap wie folgt aus:

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

, die auch in der generierten JSON gut aussieht:

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

danach verwende ich diese SortedMap einen zweiten Teil des JSON wie diese zu erstellen:

/** 
    * 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); 

der zweite Teil Ergebnis in das Objekt gesetzt bekommen

/** 
* 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; 
    } 

} 

dieser Teil des JSON sieht dann wie folgt aus:

"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 
     } 
    }, 

Wie Sie sehen können, sie nicht übereinstimmen, wie ich die Werte im zweiten Teil will mit der Reihenfolge der entsprechen ersten Teil des JSON wie folgt aus:

"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 
     } 
    }] 

Hinweis: natürlich ersetzte ich die realen Werte mit dem Feld, das ist angezeigt bekommen.

Wo ist das Problem mit dem Erstellen des zweiten Teils? Liegt es daran, dass ich das SortedSet nicht richtig in Kombination mit der SortedMap verwende?

+0

Wie werden Sie JSON konvertieren? – slim

+0

Verwendung der Standard-Konfiguration für Jackson – Nico

+0

Ist es wegen der Verwendung von 'HashMap', die Reihenfolge der Elemente nicht beibehalten? Vielleicht versuchen Sie es mit einer 'LinkedHashMap' und sehen Sie, ob Sie das gleiche Ergebnis reproduzieren können –

Antwort

2

Sie haben HashMap in Ihrem Code verwenden, die nicht die Reihenfolge der Elemente in so genannten HashMapdocumentation

keine Garantie Diese Klasse macht in Bezug auf die Reihenfolge der Karte nicht erhalten; in insbesondere garantiert es nicht, dass die Reihenfolge im Laufe der Zeit konstant bleibt.

ein LinkedHashMap Verwenden Sie die Reihenfolge der Elemente zu erhalten und es sollte Ihr Problem beheben