2013-05-04 78 views
1

我有兩個數組列表名稱preBusinessList,的businessList。在業務列表中,我有來自服務器的數據,而preBusinessList是本地數據。在列表中我有ID,計數值Betterly證明如下在java中如何合併兩個不同大小的數組列表並創建一個新的Arraylist?

enter image description here

現在,我想作一個newBusinessList這樣

image 2

我怎麼能做到這一點在Java中,請幫幫我要解決這個

+4

問題不清楚。你想從服務器中取數嗎?或者兩者的總和? – Thilo 2013-05-04 08:31:44

+0

我想,當我沒有數據的businessList比preBusinessList取數據僅合併這兩個名單的基礎上。 – 2013-05-04 08:32:49

+0

你想要做什麼標準合併?在列表索引?價值?從你的例子來看,似乎沒有這些。所以你可以澄清合併標準。基於ID和索引的 – Sebastien 2013-05-04 08:36:08

回答

0

assumming我理解正確的話您的問題(如大...):

另外,我假設在列表中的每個元素是一對 - 因爲它從你的數據(只是一個愚蠢的包裝類看起來是擁有2個整數)。如果它的某個其他類需要調整此代碼。

private Map<Integer,Integer> finalValues = new HashMap<Integer,Integer>(); 

for (Pair<Integer,Integer> entry : preBusinessList) { 
    finalValues.put(entry.getFirst(), entry.getSecond()); 
} 
//2nd list overwrites values from 1st (anything not overwritten remains) 
for (Pair<Integer,Integer> entry : businessList) { 
    finalValues.put(entry.getFirst(), entry.getSecond()); 
} 
ArrayList<Pair<Integer,Integer>> finalList = new ArrayList<>(); 
for (Map.Entry<Integer,Integer> entry : finalValues) { 
    finalList.add(new Pair(entry.getKey(), entry.getValue()); 
} 
//and now sort the list 
Collections.sort(finalList, new Comparator<Pair<Integer,Integer>> { 
    int compare(Pair<Integer,Integer> a, Pair<Integer,Integer>b) { 
     return a.getFirst.compareTo(b.getFirst()); //compare by 1st number in pair only 
    } 
}); 
+0

什麼是entry.getFirst()和getSecond? – 2013-05-04 08:48:09

+0

@ user900779擁有2個整數的類的getter方法。即時通訊假設你在你的列表中使用類似的東西,因爲你的列表中的每個條目都有2個值 - 所以它絕對不是一個簡單的對象點亮 – radai 2013-05-04 09:12:38

+0

我正在使用這個類,它只有兩個變量。 public class PlaceItems {public final static String BUSINESS_ID =「id」; public final static String BUSINESS_RESULT =「count」; public String businessId,businessResult; } – 2013-05-04 09:21:10

1

您可以使用:

Collections.sort(new ArrayList<...>(preBusinessList).addAll(businessList), comparator) 

哪裏比較是實現比較接口的類(如你所願將負責整理)

+0

可否請你給我比較的執行情況。 – 2013-05-04 08:35:22

+1

但他想從的businessList項目「覆蓋」那些來自preBusinessList – radai 2013-05-04 08:35:40

+0

@ user900779請告訴我什麼的ArrayList的類型(是一個字符串?) – 2013-05-04 08:36:59

4

然後我會用一個地圖使用ID爲重點,以執行合併,並將其轉換回你的列表( ID,值)對

+0

我同意你的觀點,下面的解決方案不會刪除重複項。 – 2013-05-04 08:42:16

+0

可否請你給我一些示例代碼,因爲我真的被困在我的最後。 – 2013-05-04 08:43:27

+0

@ user900779 - 像我的答案,我認爲 – radai 2013-05-04 08:45:33

0

僞代碼:

  1. 遍歷preBusinessList。

  2. 取鑰匙,看看這個鍵(1,2,3,4,5,6)中的businessList

  3. 存在如果是conitnue

  4. 否則如果沒有,然後將其添加到的businessList

    for(Map.Entry<Integer, Integer> keyValue : preBusinessList.entrySet()) { 
        if(!businesslist.containsKey(keyValue.getKey())) { 
         businesslist.put(keyValue.getKey(), keyValue.getValue()); 
        } 
    } 
    

回答更新按照新的要求

boolean ifExists = false; 
for(PlaceItems itemPreBusinessList : preBusinessList) { 
    ifExists = false; 
    for(PlaceItems itemBusinessList : businessList) { 
    if(itemBusinessList.businessId == itemPreBusinessList.businessId) { 
     // Already exists 
     ifExists = true; 
     break; 
    } 
    } 

    if(!isExists) { 
    businessList.add(itemPreBusinessList); 
    } 
} 
+0

嗨Anirudh,我有一個類Arraylist項目名稱。其中有兩個字符串變量 – 2013-05-04 08:55:30

+0

public class PlaceItems {public final static String BUSINESS_ID =「id」; public final static String BUSINESS_RESULT =「count」; public String businessId,businessResult; } – 2013-05-04 08:55:58

+0

你能建議我應該寫什麼來代替Mao.Entry 2013-05-04 08:56:57

0

假設是這樣的:

public class Info { 
    public int id; 
    public int info; 
} 

你可以將它們合併想在保持較高info視野中的一個如下的基礎上:

// Assumes: 
// - that the ArrayLists are sorted to have id in order going up 
// - no repeated ids in a or in b (but same id can be in both a and b) 
ArrayList<Info> merge(ArrayList<Info> a, ArrayList<Info> b) { 
    int aLength = a.size(); 
    int bLength = b.size(); 

    int ai = 0; 
    int bi = 0; 

    ArrayList<Info> result = new ArrayList<Info>(); 

    while ((ai < aLength) && (bi < bLength)) 
     Info aInfo = a.get(ai); 
     Info bInfo = b.get(bi); 
     if (aInfo.id == bInfo.id) { 
      if (aInfo.info >= bInfo.info) result.add(aInfo); 
      else       result.add(bInfo); 
      ai++; 
      bi++; 
     } 
     else if (aInfo.id < bInfo.id) { 
      result.add(aInfo); 
      ai++; 
     } 
     else { 
      result.add(bInfo); 
      bi++; 
     } 
    } 

    // Add the remaining terms - only one of the loops will actually do anything 
    for (; ai<aiLength; ai++) { 
     result.add(a.get(ai)); 
    } 
    for (; bi<biLength; bi++) { 
     result.add(b.get(bi)); 
    } 
} 
相關問題