Сравнение списков (ArrayList) - PullRequest
1 голос
/ 20 марта 2011

пример У меня есть два списка, позволяющих List newList и List oldList,

  • 1) newRec -> Создать список объектов для (newRec), найдя все объекты в newListпараметр, которого нет в параметре oldList.

  • 2) newUpdate &&

  • 3) oldUpdate -> Построить ("newUpdate") и ("oldUpdate") списки объектов дляобновить, найдя все объекты, которые существуют в обоих параметрах newList и oldList, но имеют разные описания (xxx не совпадает).

  • 4) oldRec -> Построить список объектов (oldRec), найдя все объекты в параметре oldList, которых нет в параметре newList.

так что я наконец-то получу четыре списка: newRec, newUpdate, oldUpdate, oldRec ....

любезно помогите мне .. Заранее спасибо

пожалуйста, обратитесь к моему методу ..

public Response maintainFieldDescriptions(List<BarcodeFieldDesc> newDescList,
         List<BarcodeFieldDesc> oldDescList)
   {

      try
      {
         List<BarcodeFieldDesc> writes = new ArrayList<BarcodeFieldDesc>();
         List<BarcodeFieldDesc> updatesNew = new ArrayList<BarcodeFieldDesc>();
         List<BarcodeFieldDesc> updatesOld = new ArrayList<BarcodeFieldDesc>();
         List<BarcodeFieldDesc> deletes = new ArrayList<BarcodeFieldDesc>();

         if ( newDescList != null && newDescList.size() > 0 )
         {

            for ( int i = 0; i < newDescList.size(); i++ )
            {
               BarcodeFieldDesc temp = newDescList.get(i);
               boolean handled = false;

               if ( oldDescList != null && oldDescList.size() > 0 )
               {
                  for ( int j = 0; j < oldDescList.size(); j++ )
                  {
                     BarcodeFieldDesc temp2 = oldDescList.get(j);
                     if ( temp.getKey().equals(temp2.getKey()) )
                     {
                        handled = true;
                        // Keys match
                        if ( !temp.toString().equals(temp2.toString()) )
                        {
                           // Difference found
                           updatesNew.add(temp);
                           updatesOld.add(temp2);
                        }
                     }
                     else
                     {
                        // Keys do not match
                     }
                  }

               }
               if ( !handled )
               {
                  writes.add(temp);
               }
            }

         }

         if ( oldDescList != null && oldDescList.size() > 0 )
         {
            for ( int i = 0; i < oldDescList.size(); i++ )
            {
               BarcodeFieldDesc temp = oldDescList.get(i);
               boolean handled = false;
               for ( int j = 0; j < newDescList.size(); j++ )
               {
                  BarcodeFieldDesc temp2 = newDescList.get(j);
                  if ( temp.getKey().equals(temp2.getKey()) )
                  {
                     handled = true;
                  }
                  else
                  {
                     // Keys do not match
                  }
               }
               if ( !handled )
               {
                  deletes.add(temp);
               }
            }
         }

 public String getKey()
       {
          String result = "";
          result = result + StringUtil.pad(getFDPART(), 3, ' ', 'L');
          result = result + StringUtil.pad(getFDPROF(), 10, ' ', 'L');
          result = result + StringUtil.pad(getFDOTFT(), 20, ' ', 'L');
          result = result + StringUtil.pad(getFDLNGC(), 2, ' ', 'L');
          return result;
       }

   public String toString()
   {
      String result = "";
      result = result + StringUtil.pad(getFDPART(), 3, ' ', 'L');
      result = result + StringUtil.pad(getFDPROF(), 10, ' ', 'L');
      result = result + StringUtil.pad(getFDOTFT(), 20, ' ', 'L');
      result = result + StringUtil.pad(getFDLNGC(), 2, ' ', 'L');
      result = result + StringUtil.pad(getFDDESC(), 32, ' ', 'L');
      return result;
   }

, который находится в классе BarcodeFieldDesc ..

поэтому здесь, если newList и OldList имеют элемент, то он не создает список newUpdate и oldUpdate..

Ответы [ 2 ]

1 голос
/ 20 марта 2011

1

List<Object> newRec = new ArrayList<Object>();
for (Object obj : newList) {
    if (! oldList.contains(obj)) {
        newRec.add(obj);
    }
}

2

//NOTE:  this assumes that 'MyObject' has an equals() implementation 
//       that ignores the 'description' field 
List<MyObject> newUpdate = new ArrayList<MyObject>();
List<MyObject> oldUpdate = new ArrayList<MyObject>();
for (MyObject obj : newList) {
    if (oldList.contains(obj)) {
        MyObject oldObj = oldList.get(oldList.indexOf(obj));
        if (! oldObj.getDescription().equals(obj.getDescription())) {
            newUpdate.add(obj);
            oldUpdate.add(oldObj);
        }
    }
}

3

List<Object> oldRec = new ArrayList<Object>();
for (Object obj : oldList) {
    if (! newList.contains(obj)) {
        oldRec.add(obj);
    }
}
1 голос
/ 20 марта 2011

1) список объектов только в новом списке

List newRec = new ArrayList(newList);
newRec.removeAll(oldList);

2) Что вы подразумеваете под "разными описаниями"? Является ли «описание» свойством объектов, которые вы помещаете в список? В этом случае просто

List newUpdate = new ArrayList(newList);
newUpdate.removeAll(newRec);

-> дает список объектов в newList, которые также есть в oldList. Это то, что вы хотите?

Если да, вы можете построить oldUpdate таким же образом (после построения следующего списка, oldRec)

3) список объектов только в oldList

List oldRec = new ArrayList(oldList);
oldList.removeAll(newList);

-

Чтобы это работало, вам нужно правильно реализовать equals ().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...