簡體   English   中英

與TreeMap和TreeSet排序不同步

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM