Java 使用TreeMap和TreeSet进行排序时未同步
我对两个组件的排序有问题,不知道为什么 我创建了一个分类地图,如下所示:Java 使用TreeMap和TreeSet进行排序时未同步,java,json,sorting,Java,Json,Sorting,我对两个组件的排序有问题,不知道为什么 我创建了一个分类地图,如下所示: private static SortedMap<String, String> getMapping( List<LdapMapping> mapping ) { SortedMap<String, String> fieldMapping = new TreeMap<>(); for ( LdapMapping map : mapping )
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;
}
/**
* 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 );
"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
}
},
"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
}
}]
之后,我使用这个sortedMap创建JSON的第二部分,如下所示:
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;
}
/**
* 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 );
"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
}
},
"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
}
}]
如您所见,它们不匹配,因为我希望第二部分中的值与JSON第一部分的顺序匹配,如下所示:
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;
}
/**
* 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 );
"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
}
},
"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
}
}]
注意:我很自然地用显示的get字段替换了实际值
创建第二部分的问题在哪里?
是因为我没有正确地将SortedSet与SortedMap结合使用吗?您在代码中使用了
HashMap
,它没有保留HashMap
中提到的项目顺序
此类不保证地图的顺序;在里面
特别是,它不能保证订单保持不变
随着时间的推移
使用
LinkedHashMap
保留项目的顺序,它应该可以解决您的问题如何转换为JSON?使用Jacksoni的标准配置是因为使用了HashMap
,没有保留项目的顺序?也许可以尝试使用LinkedHashMap
,看看是否可以重现相同的结果,就是这样@SamuelKok!你能把你的解决方案写在一个答案里,这样我就可以接受了吗?太蠢了,我没想到那张羞耻的脸,很高兴它有用。干杯