itro
itro

Reputation: 7228

how to get duplicated and non duplicated element of arrayList?

I have an object as Riziv with three variables as id, cnk and product. Then I search in a databank for this object and add it to a ArrayList as ArrayList<Riziv> list.
Now I should checkout if all object in his array are the same cnk then return true otherwise I should return all objects which are not the same cnk with error message.

  public class Riziv{ String id, cnk, product; }
    ArrayList<Riziv> list = getArrayListFromDatabank(id);

    public void getDuplicatedWhichHasTheSameCnk(){

    }
  }

Upvotes: 1

Views: 585

Answers (3)

Reid Mac
Reid Mac

Reputation: 2489

One way to do it is write a comparator to sort the list by cnk String and then compare each consecutive cnk String to the next, if you find a duplicate, they will be right next to eachother.

1.) Sort the list using a comparator by sorting on the cnk variable.

2.) Compare each element in the list to the next for duplicates.

There's probably many other ways to solve this, this is just the first that came to mind.

I did not test this so you have been forewarned lol:

ArrayList<Riziv> rizArray = new ArrayList<Riziv>();
        //Sort the array by the CNK variable.
        Collections.sort(rizArray, new Comparator<Riziv>(){
            @Override
            public int compare(Riziv arg0, Riziv arg1) {
                //Return the comparison of the Strings.
                //Use .compareToIgnoreCase if you want to ignore upper/lower case.
                return arg0.getCnk().compareTo(arg1.getCnk());
            }
        });
        //List should be in alphabetical order at this point.
        List<Riziv> duplicates = new ArrayList<Riziv>();
        Riziv rizPrevious = null;
        for(Riziv riz: rizArray){
            if(rizPrevious == null){
                rizPrevious = riz;
                continue;
            }
            if(riz.getCnk().compareTo(rizPrevious.getCnk()) == 0){
                duplicates.add(riz);
            }
            rizPrevious = riz;
        }

Upvotes: 0

fge
fge

Reputation: 121712

Using standard JVM structures (MultiMap is provided by guava), you can do that:

public List<Riviz> getDuplicates(final List<Riviz> l)
{
    final HashMap<String, List<Riviz>> m = new HashMap<String, List<Riviz>>();
    final List<Riviz> ret = new ArrayList<Riviz>();

    String cnk;

    for (final Riviz r: l) {
        cnk = r.getCnk();
        if (!m.contains(cnk))
            m.add(cnk, new ArrayList<Riviz>());
        m.get(cnk).add(r);            
    }

    List<Riviz> tmp;
    for (final Map.Entry<String, List<Riviz>> entry: m.entrySet()) {
        tmp = entry.getValue();
        if (tmp.size() == 1) // no dups
            continue;
        ret.addAll(tmp);
    }

    return ret;
}

ret will contain the duplicates. You can change that function to return a Map<String, Riviz> instead, and filter out entries where the list size is only one. You'll then get a map with the conflicting cnks as keys and a list of dups as values.

Upvotes: 1

Peter Lawrey
Peter Lawrey

Reputation: 533492

I am not clear exactly what you want however I suspect you want something like this.

MultiMap<Key, Riziv> multiMap = 
List<Riziv> list = 
for(Riziv r: list)
   multiMap.put(r.getCnk(), r);

for(Key cnk: multiMap.keySet()) {
    Collection<Riziv> sameCnk = multiMap.get(cnk);
    // check size and compare entries
}

The multi-map will have the list of Riziv objects for each Cnk.

Upvotes: 1

Related Questions