从ArrayList调用所有组合的最有效方法?

时间:2013-10-14 16:04:14

标签: java arraylist

我有一个项目的数组列表,每个项目都有一个方法,可以将任何其他项目作为参数。什么是确保我在每个可能的项目上调用方法而不重复它们的最有效方法? (可以假设所有项目都是唯一的。)

我的代码:

public boolean hasConflict (ArrayList<Item> items) {
    // For every possible pair of items...
        one = items.get(i);
        two = items.get(j);

        if ( one.conflictsWith (two)) {
            return true;
        }

    // If we reach the end of the list without finding a conflict
    return false;
}

编辑:

one.conflictsWith (two)将返回与two.conflictsWith (one)相同的值,对于遗忘而道歉。

conflictsWith方法没有比较以查看这两个值是否重复,所以不幸的是我无法使用哈希表对其进行排序。

3 个答案:

答案 0 :(得分:3)

如果您不需要拨打a.conflictsWith(b)以及b.conflictsWith(a),那么您可以通过以下方式节省时间:

for(int i = 0; i < list.size(); ++i) {
    final MyClass curr = list.get(i);
    for(int j = i + 1; j < list.size(); ++j) {
        curr.conflictsWith(list.get(j));
    }
}

即。循环遍历List,然后在第二个循环中循环遍历{{1>}的余数

否则你需要遍历所有

List

答案 1 :(得分:1)

如果conflictsWith()是对称的,即对每对参数都是one.conflictsWith(two) == two.conflictsWith(one),那么使用:

for (int i = 0; i < items.size(); i++)
{
    final Item one = items.get(i);
    for (int j = i + 1; j < items.size(); j++}
    {
        one.conflictsWith(items.get(j));
    }
}

如果不对称,则必须再检查2次:

for (int i = 0; i < items.size(); i++)
{
    final Item one = items.get(i);
    for (int j = 0; j < items.size(); j++} // only this line changed
    {
        one.conflictsWith(items.get(j));
    }
}

最后一个也会检查one.conflictsWith(one)。如果这是一个问题,请使用if (i != j)

答案 2 :(得分:1)

由于我们不知道“冲突”意味着什么,例如,如果a.conflictsWith(b)a. conflictsWith(c)表示关于b.conflictsWith(c)的s.th,您必须触及每个组合,即< / p>

   for(int i=0; i< items.size(); i++) {
     Item item = items.get(i);
     for(int j=0; j< items.size(); j++)
       if(item.conflictsWith(items.get(j)) return true;
     }
   }
   return false;

如果关系conflictWith是对称的,并且如果a.conflictsWith(a)始终为false,则可以使用

   for(int i=0; i< items.size(); i++) {
     Item item = items.get(i);
     for(int j=i+1; j< items.size(); j++)
       if(item.conflictsWith(items.get(j)) return true;
     }
   }
   return false;