2012-09-01 193 views
0

我有兩個列表,其中一個列表的順序與其他列表的順序不同,列表中我添加了一個映射,其中列表中的鍵順序不同。我想要這兩個列表的順序相同。我該如何執行此操作?基於另一個列表的順序排列列表

Map<Long, String> attfieldMap = null; 
attfieldMap = view.getNameMap(form); 

List<Field> auditMap = new ArrayList<Field>(); 
if (itemId != 0) { 

    Item dom = getRecord(); 

    Map<FormField, Object> tempValues = dom.getValues(); 
    List<Field> oldValues = new ArrayList<Field>(); 

    for (Map.Entry<FormField, Object> values : tempValues 
      .entrySet()) { 
     Field oldFld = new Field(); 
     Form form = (Form) values.getKey(); 

     if (attfieldMap.get(form.getField().getId()) != null) { 
      oldFld.setKey(attfieldMap.get(form.getField() 
        .getId())); 
      oldFld.setValue(values.getValue()); 

      oldValues.add(oldFld); 
     } 
    } 
} 


for (Map.Entry<Long, String> attfieldEntry : attfieldMap.entrySet()) { 
    // Mandates to declare within loop 
    Field attributeFld = new Field; 

    attributeFld.setKey(attfieldEntry.getValue()); 
    attributeFld.setValue(String.valueOf(attfieldEntry.getKey())); 

    auditMap.add(attributeFld); 
} 

名單auditMap有地圖與關鍵att13att12att14oldValues具有地圖與關鍵att12att13att14。我需要這個列表與auditMap列表的順序相同。如何訂購?

根據answeres編輯下面的代碼:這裏數據被複制,即使列表大小不同,列表大小也不同.list1應該有自己的數據,list2應該有相同的數據,但順序應該是保持

List<Field> auditMap = new ArrayList<Field>(); 
      attfieldMap = View 
        .getFieldID(form); 

      for (Map.Entry<Long, String> attfieldEntry : attfieldMap.entrySet()) { 

       Field attributeFld = new Field(); 

       attributeFld.setKey(attfieldEntry.getValue()); 
       attributeFld.setValue(String.valueOf(attfieldEntry.getKey())); 

       auditMap.add(attributeFld); 
       attributeFld = null; 
      } 

      if (itemId != 0) { 

       Item dom = getRecord(domainItem); 

       Map<FormField, Object> tempValues = dom.getValues(); 
       List<Field> oldValues = new ArrayList<Field>(); 

       for (Map.Entry<FormField, Object> values : tempValues 
         .entrySet()) { 
        Field oldFld = new Field(); 
        Form form = (Form) values.getKey(); 

        if (attfieldMap.get(form.getField().getId()) != null) { 
         oldFld.setKey(attfieldMap.get(form.getField() 
           .getId())); 
         oldFld.setValue(values.getValue()); 

         oldValues.add(oldFld); 
        } 

       } 
       final Map<Field, Integer> indices = new HashMap<Field, Integer>(); 
       for (int i = 0; i < oldValues.size(); i++) { 
        indices.put(oldValues.get(i), i); 
       } 
       Collections.sort(auditMap, new Comparator<Field>() { 
        public int compare(Field o1, Field o2) { 
         int index1 = indices.containsKey(o1) ? indices.get(o1) 
           : -1; 
         int index2 = indices.containsKey(o2) ? indices.get(o2) 
           : -1; 
         return index1 - index2; 
        } 
       }); 
       for (int i = 0; i < oldValues.size(); i++) { 
        LOGGER.info("the new data is--" + oldValues.get(i).getKey()); 
       } 
       for (int i = 0; i < auditMap.size(); i++) { 
        LOGGER.info("the new data is--" + auditMap.get(i).getKey()); 
       } 

這是我的實際代碼,數據是沒有得到在auditMap ordered.The鍵1,2,3,4和舊值是1,3,2舊值的結果應該是1,2,3但它沒有發生

+0

AFAIU沒有辦法保證在條目集條目的順序。我懷疑你正在使用完全錯誤的數據結構來實現'相同的順序'。 –

+0

這兩個列表中的數據都來自其他方法。 – pars

+0

'列表auditMap包含映射關鍵字att13,att12,att14'您打算引用attfieldmap嗎? – Vikdor

回答

3

如果你想要的是,在該代碼片段的結尾,auditMap和oldValues應該是相同的順序,只需通過集合運行它們.sort()方法以及Field對象的適當比較器。

如果不是,則在IF塊之後創建一個與oldValues大小相同的字段數組(您當然需要在IF塊之外聲明該值)。每次你想插入一個元素到auditMap中,在oldValues中找到它的索引(假設你有適當的equals方法實現來檢查兩個對象是否相等),並在auditMapArray的同一位置插入,最後使用Arrays.asList(auditMapArray)獲取auditMap列表。

您的代碼片段的修改版本可確保auditMap中存在的oldValues中的所有值具有相同的順序。任何額外的元素到auditMap中都會附加到最後。

Map<Long, String> attfieldMap = null; 
attfieldMap = view.getNameMap(form); 

List<Field> oldValues = new ArrayList<Field>(); 
if (itemId != 0) { 

    Item dom = getRecord(); 

    Map<FormField, Object> tempValues = dom.getValues(); 

    for (Map.Entry<FormField, Object> values : tempValues 
      .entrySet()) { 
     Field oldFld = new Field(); 
     Form form = (Form) values.getKey(); 

     if (attfieldMap.get(form.getField().getId()) != null) { 
      oldFld.setKey(attfieldMap.get(form.getField() 
        .getId())); 
      oldFld.setValue(values.getValue()); 

      oldValues.add(oldFld); 
     } 
    } 
} 

List<Field> otherFields = new ArrayList<Field>(); 
Field [] auditMapArray = new Field[oldValue.size()]; 
int index; 
for (Map.Entry<Long, String> attfieldEntry : attfieldMap.entrySet()) { 
    // Mandates to declare within loop 
    Field attributeFld = new Field; 

    attributeFld.setKey(attfieldEntry.getValue()); 
    attributeFld.setValue(String.valueOf(attfieldEntry.getKey())); 

    index = oldValues.indexOf(attributeFld); 
    if (index > 0) { 
     auditMapArray[index] = attributeFld; 
    } 
    else 
    { 
     System.err.println(attributeFld + " not found in oldValues"); 
     otherFields.add(attributeFld); 
    } 
} 

List<Field> auditMap = Arrays.asList(auditMapArray); 
auditMap.addAll(otherFields); 
+0

如果沒有順序(第一個列表元素是隨機的),並且只是希望第二個列表順序是相同的? – dcernahoschi

+0

@Vikdor你可以請示例給我看,我不清楚 – pars

+0

@pars,請在編輯中找到示例代碼。 – Vikdor

3

您可以使用自定義比較器對第二個列表進行排序,使用第一個列表中的項目索引作爲關鍵字。事情是這樣的:

Collections.sort(list2, new Comparator() { 
    public int compare(Object o1, Object o2) { 
     return list1.indexOf(o1) - list1.indexOf(o2); 
    }}); 

更新:由於indexOf可能需要一些時間,如果該列表未排序,並因爲這種方法將被稱爲非常時候,它可能是更好的第一存儲對象的索引中一個地圖,即創建一個HashMap {item:list1.indexOf(item)},並在compare方法中使用該地圖。

將其組合在一起,並使用您的示例中的名字:

final Map<Field, Integer> indices = new HashMap<Field, Integer>(); 
for (int i=0; i < oldValues.size(); i++) { 
    indices.put(oldValues.get(i), i); 
} 
Collections.sort(auditMap, new Comparator<Field>() { 
    public int compare(Field o1, Field o2) { 
     int index1 = indices.containsKey(o1) ? indices.get(o1) : -1; 
     int index2 = indices.containsKey(o2) ? indices.get(o2) : -1; 
     return index1 - index2; 
    }}); 
+0

可以在我發佈的代碼片段中顯示這個 – pars

+0

我可以在放入oldValues列表之前訂購數據嗎 – pars

+0

我有關於下面的sort函數的查詢,如果auditMap並且olsdValues具有不等數據,那麼排序將如何工作 – pars

相關問題