[英]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.