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!你能把你的解决方案写在一个答案里,这样我就可以接受了吗?太蠢了,我没想到那张羞耻的脸,很高兴它有用。干杯