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组合不正确?
你是如何转换成JSON? – slim
对杰克逊使用标准配置 – Nico
是否由于使用了不保留项目顺序的“HashMap”?也许尝试使用'LinkedHashMap'并查看是否可以重现相同的结果 –