我有两个arraylist名称preBusinessList,businessList。在业务列表中,我有来自服务器的数据,而在 preBusinessList 中是本地数据。在我有 id 的列表中,计数值更好地演示如下
现在我想做一个这样的 newBusinessList
我如何在java中做到这一点,请帮我解决这个问题
然后我会使用映射来使用 id 作为键进行合并并将其转换回您的 (id,value) 对列表
您可以使用:
Collections.sort(new ArrayList<...>(preBusinessList).addAll(businessList), comparator)
其中比较器是一个实现比较器接口的类(将负责按您的意愿排序)
伪代码:
迭代 preBusinessList。
获取密钥并查看此密钥(1,2,3,4,5,6)是否存在于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);
}
}
假设我正确理解了您的问题(如果...大的话):
另外,我假设列表中的每个元素都是一对 - 从您的数据中看起来(只是一个包含 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
}
});
假设类似:
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));
}
}