我有一个Hashtable<List<Integer>, List<Triples>> ResultIPM2 = new HashTable<>()
,我想研究关键部分List<Integer>
包含三种模式{[2,3,4],[3,2,4,3], [2,4,3]}。我想要做的是,我想删除[2,4,3],因为它是[3,2,4,3]的一个子集。我怎样才能报告[2,4,3]和[3,2,4,3]。
请注意,交叉点的顺序必须与较小的列表的顺序相同。
例如,如果不是[3,2,4,3]我们有一个模式[3,2,3,4],我们就不会删除任何模式。通过“删除”我的意思是在报告时不显示模式。这是我的一段代码: 请不要关心其他答案,因为我必须编辑这个旧问题才能提出新问题。谢谢你
Set<List<Integer>> key = resultsIPM2.keySet();
boolean maximal = false;
for(List<Integer> p1 : key){
for(List<Integer> p2:key){
if(!p2.equals(p1)){
if(p1.containsAll(p2)){
System.out.println(p1);
}
}
}
}
答案 0 :(得分:4)
您无法使用增强型for循环从列表中删除。使用显式迭代器。
List<List<Pair>> newPattern = new CopyOnWriteArrayList<>();
//Algorithm : end of Line 14
Iterator<List<Pair> iter = ptList.iterator();
while(iter.hasNext()){
List<Pair> list = iter.next();
Iterator<Pair> pairIter = list.iterator();
while(pairIter.hasNext()){
Pair pair = pairIter.next();
if (getFrequency(pair) < minSupp){
pairIter.remove();
newPattern.add(list);
}
}
}
答案 1 :(得分:0)
Iterator.remove()
是在迭代过程中修改集合的唯一安全方法。
当您需要删除当前元素时,请使用Iterator
代替for-each
构造。
The for-each
构造隐藏了迭代器,因此您无法调用remove。因此,for-each
构造不可用于过滤。
现在关于您说的工作的代码是因为
Iterator <Pair> iter = pairList.iterator();
应该是这样的
Iterator<List<Pair> iter = ptList.iterator();
然后再次iter.next();
它会为您List<Pair> list
而不是Pair pair
。所以你需要再次遍历列表比较并删除。
伊兰给了你一个非常好的例子
答案 2 :(得分:0)
当您处于此列表的foreach循环中时,无法修改列表。您可以使用正常的for循环,只需递增int
即可获得元素:
List<List<Pair>> newPattern = new CopyOnWriteArrayList<>();
//Algorithm : end of Line 14
for(int i = 0; i < ptList.size(); i++){
List<Pair> list = ptList.get(i);
for(int j = 0; j < list.size(); j++){
Pair pair = list.get(j);
if (getFrequency(pair) < minSupp){
list.remove(j);
j--;
newPattern.add(list);
}
}
}