如何获得arrayList的重复和非重复元素?

时间:2011-12-22 13:20:08

标签: java list arraylist set

我有一个像Riziv的对象,有三个变量,如id,cnk和product。然后我在数据库中搜索此对象,并将其添加到ArrayList作为ArrayList<Riziv>列表。
现在我应该检查他的数组中的所有对象是否相同cnk然后返回true否则我应该返回所有不同cnk的对象并带有错误消息。

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

    public void getDuplicatedWhichHasTheSameCnk(){

    }
  }

3 个答案:

答案 0 :(得分:2)

我不清楚你想要什么,但我怀疑你想要这样的东西。

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
}

多地图将包含每个Cnk的Riziv对象列表。

答案 1 :(得分:1)

使用标准JVM结构(由guava提供MultiMap),您可以这样做:

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将包含重复项。您可以更改该函数以返回Map<String, Riviz>,并过滤掉列表大小仅为1的条目。然后,您将获得一张带有冲突cnks的地图作为键将重复列表作为值。

答案 2 :(得分:1)

一种方法是编写一个比较器来按cnk String对列表进行排序,然后将每个连续的cnk字符串与下一个字符串进行比较,如果找到重复字符串,它们将紧挨着彼此。

1。)通过对cnk变量进行排序,使用比较器对列表进行排序。

2。)将列表中的每个元素与下一个元素进行比较。

可能有很多其他方法可以解决这个问题,这只是第一个想到的方法。

我没有对此进行测试,所以你已经预先警告过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;
        }