我有一个像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(){
}
}
答案 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;
}