1

我有两个arraylist名称preBusinessList,businessList。在业务列表中,我有来自服务器的数据,而在 preBusinessList 中是本地数据。在我有 id 的列表中,计数值更好地演示如下

在此处输入图像描述

现在我想做一个这样的 newBusinessList

图 2

我如何在java中做到这一点,请帮我解决这个问题

4

5 回答 5

4

然后我会使用映射来使用 id 作为键进行合并并将其转换回您的 (id,value) 对列表

于 2013-05-04T08:40:57.673 回答
1

您可以使用:

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

其中比较器是一个实现比较器接口的类(将负责按您的意愿排序)

于 2013-05-04T08:33:47.190 回答
0

伪代码:

  1. 迭代 preBusinessList。

  2. 获取密钥并查看此密钥(1,2,3,4,5,6)是否存在于businesslist中

  3. 如果是,请继续

  4. 否则,如果没有,则将其添加到业务列表

    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);
   }
 }
于 2013-05-04T08:41:21.690 回答
0

假设我正确理解了您的问题(如果...大的话):

另外,我假设列表中的每个元素都是一对 - 从您的数据中看起来(只是一个包含 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
    }
});
于 2013-05-04T08:43:00.617 回答
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));
    }
}
于 2013-05-04T08:48:34.187 回答