如何在java中的一个整数Arraylist中的项目中找到子列表(交集)?

时间:2014-08-03 13:12:07

标签: java arraylist

我有一个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);
             }
         }   
        }

    }

3 个答案:

答案 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);
         }
    }
}