Объединить два массива классов


У меня есть эта функция, которая должна объединить два массива классов, когда идентификатор массива array1 равен идентификатору из массив2.

Для простоты я принял один массив в объект ArrayList, так что я могу удалить слили вхождение в другую..

Я ищу способ, чтобы улучшить его, также в CPU-времени, потому что два массива могут иметь более 20000rows. Реальный путь, должно пройти определенное время..

public Asset[] merge(Asset[] a2, ArrayList<countR> a)
{
        while (a.size()!=0){
            int i=0;
            Boolean b=false;
            while (i<a2.length && b==false)
            {
                if (a.get(0).id.equals(a2[i].id)){
                    a2[i].TotaleRegistrazioni = a.get(0).tot; 
                    b=true;
                }               
                i++;
            }
            a.remove(0);
        }
return a2;
}


470
6
задан 30 октября 2011 в 05:10 Источник Поделиться
Комментарии
1 ответ

Оставаясь с ваш оригинальный код, который вы можете изменить Б на простой перерыв и можно менять внутренний , а на ДЛЯ , который легче читать:

public Asset[] merge2(final Asset[] firstArray, final ArrayList<CountR> secondList) {
while (secondList.size() != 0) {
for (int i = 0; i < firstArray.length; i++) {
final CountR countR = secondList.get(0);
final Asset asset = firstArray[i];
if (countR.id.equals(asset.id)) {
asset.TotaleRegistrazioni = countR.tot;
break;
}
}
secondList.remove(0);
}
return firstArray;
}

Поиск в хранилище HashMap должны быть быстрее, чем перебирая весь массив, так что я бы сделал следующие:

public Asset[] merge3(final Asset[] firstArray, final CountR[] secondArray) {
final Map<Id, Asset> assetCache = new HashMap<Id, Asset>();
for (final Asset asset : firstArray) {
final Id id = asset.getId();
assetCache.put(id, asset);
}

for (final CountR countR : secondArray) {
final Id countRId = countR.getId();
final Asset asset = assetCache.get(countRId);
if (asset != null) {
// I supposed that it's int
final int total = countR.getTot();
asset.setTotaleRegistrazioni(total);
}
}

return firstArray;
}

(Я предполагал, что актив.идентификатор является уникальным в массиве.) В этом случае вам не придется конвертировать второй параметр в массив (просто первое на карте). Может быть, ее стоит играть с initialCapacity и loadFactor параметров этого HashMap , чтобы избежать изменения размеров.

5
ответ дан 30 октября 2011 в 09:10 Источник Поделиться