繁体   English   中英

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

[英]how to get duplicated and non duplicated element of arrayList?

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

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

    public void getDuplicatedWhichHasTheSameCnk(){

    }
  }

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

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对象的列表。

使用标准的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作为键, 一个dups列表作为值。

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

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

2)比较列表中的每个元素与下一个元素是否重复。

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

我没有对此进行测试,所以您已经被警告了大声笑:

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;
        }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM