compare lists

compares two lists. If items are missing, adds "" to the list.

Download comparelists.zip

Synopsis:

comparelists.cs
comparelists_test.cs


comparelists.cs

Synopsis
using System;
using System.Collections;

public class comparelists
{
  private readonly string cMissingEntry = "<missing>";
  private ArrayList mLeftList;
  private ArrayList mRightList;
  int mLeftIndex = 0;
  int mRightIndex = 0;

  public void compare(ArrayList leftlist, ArrayList rightlist)
  {
    if (ListsAreEmpty(leftlist, rightlist)) return;

    mLeftList = leftlist;
    mRightList = rightlist;

    for(Initialize(); !IsLeftDone() || !IsRightDone(); NextItems())
      CheckForMissingItems();
  }
  private bool ListsAreEmpty(ArrayList leftlist, ArrayList rightlist)
  {
    if (leftlist == null || rightlist == null) return true;
    if (leftlist.Count == 0 || rightlist.Count == 0) return true;
    return false;
  }
  private void Initialize()
  {
    //because of the sorts, you can not call compare() twice in a row
    mLeftList.Sort();
    mRightList.Sort();

    mLeftIndex = 0;
    mRightIndex = 0;
  }
  private void NextItems()
  {
    ++mLeftIndex;
    ++mRightIndex;
  }
  private void CheckForMissingItems()
  {
    if (IsRightDone())
      AddMissingToRight();
    else if (IsLeftDone())
      AddMissingToLeft();
    else
    {
      int cmp = CompareLeftToRight();
      if (cmp < 0)
        InsertMissingIntoRight();
      else if (cmp > 0)
        InsertMissingIntoLeft();
    }
  }
  private void AddMissingToRight()
  {
    mRightList.Add(cMissingEntry);
  }
  private void AddMissingToLeft()
  {
    mLeftList.Add(cMissingEntry);
  }
  private void InsertMissingIntoRight()
  {
    mRightList.Insert(mLeftIndex, cMissingEntry);
  }
  private void InsertMissingIntoLeft()
  {
    mLeftList.Insert(mRightIndex, cMissingEntry);
  }
  private int CompareLeftToRight()
  {
    return ((string) mLeftList[mLeftIndex]).CompareTo((string)mRightList[mRightIndex]);
  }
  private bool IsLeftDone()
  {
    return mLeftIndex >= mLeftList.Count;
  }
  private bool IsRightDone()
  {
    return mRightIndex >= mRightList.Count;
  }
}

comparelists_test.cs

Synopsis
using System;
using System.Collections;
using ut;

public class testcomparelists
{
  comparelists mCompare = new comparelists();
  public void testnulllists()
  {
    try 
    {
      mCompare.compare(null, null);
    } 
    catch (Exception )
    {
      utx.assert("null lists", false);
    }
  }
  public void testemptylists()
  {
    ArrayList list1 = new ArrayList();
    ArrayList list2 = new ArrayList();
    try 
    {
      mCompare.compare(list1, list2);
    } 
    catch (Exception )
    {
      utx.assert("empty lists", false);
    }
    utx.assert(list1, list2);
  }
  public void testhappypath()
  {
    ArrayList listres = new ArrayList(new object[] {"a", "b", "c"});
    ArrayList list1 = listres;
    ArrayList list2 = listres;
    mCompare.compare(list1, list2);
    utx.assert(list1, list2);
    utx.assert(list1, listres);
    utx.assert(list2, listres);
  }
  public void testmissingfromlist1_longer()
  {
    ArrayList list1 = new ArrayList(new object[] {"a", "b"});
    ArrayList list2 = new ArrayList(new object[] {"a"});
    ArrayList list1res = new ArrayList(new object[] {"a", "b"});
    ArrayList list2res = new ArrayList(new object[] {"a", "<missing>"});
    mCompare.compare(list1, list2);
    utx.assertnot(list1, list2);
    utx.assert(list1, list1res);
    utx.assert(list2, list2res);
  }
  public void testmissingfromlist2_longer()
  {
    ArrayList list1 = new ArrayList(new object[] {"a"});
    ArrayList list2 = new ArrayList(new object[] {"a", "b"});
    ArrayList list1res = new ArrayList(new object[] {"a", "<missing>"});
    ArrayList list2res = new ArrayList(new object[] {"a", "b"});
    mCompare.compare(list1, list2);
    utx.assertnot(list1, list2);
    utx.assert(list1, list1res);
    utx.assert(list2, list2res);
  }
  public void testmissingfromlist1_first()
  {
    ArrayList list1 = new ArrayList(new object[] {     "b", "c"});
    ArrayList list2 = new ArrayList(new object[] {"a", "b", "c"});
    ArrayList list1res = new ArrayList(new object[] {"<missing>", "b", "c"});
    ArrayList list2res = new ArrayList(new object[] {"a", "b", "c"});
    mCompare.compare(list1, list2);
    utx.assertnot(list1, list2);
    utx.assert(list1, list1res);
    utx.assert(list2, list2res);
  }
  public void testmissingfromlist1_middle()
  {
    ArrayList list1res = new ArrayList(new object[] {"a", "<missing>", "c"}); //list1 is the 'master'
    ArrayList list2res = new ArrayList(new object[] {"a", "b", "c"});
    ArrayList list1 = new ArrayList(new object[] {"a",      "c"});
    ArrayList list2 = new ArrayList(new object[] {"a", "b", "c"});
    mCompare.compare(list1, list2);
    utx.assertnot(list1, list2);
    utx.assert(list1, list1res);
    utx.assert(list2, list2res);
  }
  public void testmissingfromlist1_last()
  {
    ArrayList list1 = new ArrayList(new object[] {"a", "b"});
    ArrayList list2 = new ArrayList(new object[] {"a", "b", "c"});
    ArrayList list1res = new ArrayList(new object[] {"a", "b", "<missing>"}); //list1 is the 'master'
    ArrayList list2res = new ArrayList(new object[] {"a", "b", "c"});
    mCompare.compare(list1, list2);
    utx.assertnot(list1, list2);
    utx.assert(list1, list1res);
    utx.assert(list2, list2res);
  }
  public void testmissingfromlist2_first()
  {
    ArrayList list1 = new ArrayList(new object[] {"a", "b", "c"});
    ArrayList list2 = new ArrayList(new object[] {      "b", "c"});
    ArrayList list1res = new ArrayList(new object[] {"a", "b", "c"});
    ArrayList list2res = new ArrayList(new object[] {"<missing>", "b", "c"});
    mCompare.compare(list1, list2);
    utx.assert(list1.Count, list2.Count);
    utx.assertnot(list1, list2);
    utx.assert(list1, list1res);
    utx.assert(list2, list2res);
  }
  public void testmissingfromlist2_middle()
  {
    ArrayList list1 = new ArrayList(new object[] {"a", "b", "c"});
    ArrayList list2 = new ArrayList(new object[] {"a",      "c"});
    ArrayList list1res = new ArrayList(new object[] {"a", "b", "c"});
    ArrayList list2res = new ArrayList(new object[] {"a", "<missing>", "c"});
    mCompare.compare(list1, list2);
    utx.assert(list1.Count, list2.Count);
    utx.assertnot(list1, list2);
    utx.assert(list1, list1res);
    utx.assert(list2, list2res);
  }
  public void testmissingfromlist2_last()
  {
    ArrayList list1 = new ArrayList(new object[] {"a", "b", "c"});
    ArrayList list2 = new ArrayList(new object[] {"a", "b"     });
    ArrayList list1res = new ArrayList(new object[] {"a", "b", "c"});
    ArrayList list2res = new ArrayList(new object[] {"a", "b", "<missing>"});
    mCompare.compare(list1, list2);
    utx.assert(list1.Count, list2.Count);
    utx.assertnot(list1, list2);
    utx.assert(list1, list1res);
    utx.assert(list2, list2res);
  }
  public void testmissingfromboth()
  {
    ArrayList list1 = new ArrayList(new object[] {"a",     "c"     });
    ArrayList list2 = new ArrayList(new object[] {"a", "b",    "d" });
    ArrayList list1res = new ArrayList(new object[] {"a", "<missing>", "c", "<missing>"});
    ArrayList list2res = new ArrayList(new object[] {"a", "b", "<missing>", "d"});
    mCompare.compare(list1, list2);
    utx.assert(list1.Count, list2.Count);
    utx.assertnot(list1, list2);
    utx.assert(list1, list1res);
    utx.assert(list2, list2res);
  }
}






Contact me about content on this page using john_web-at-arrizza-dot-com
For Web Master or site problems contact: webadmin-at-arrizza-dot-com
Copyright John Arrizza (c) 2001,2002,2003,2004,2005,2006,2007