剪枝条件对应添加的位置——在dfs()函数中,在递归调用前剪枝(最前面)。
剪枝条件
//条件一:item_table.containsKey(temp) 条件二:item_table.get(temp).support < Info.min_sup
if(item_table.containsKey(temp) && item_table.get(temp).support < Info.min_sup){
return;
}
另一种写法
if(item_table.getOrDefault(temp,Info.min_sup)<Info.min_sup){
return;
}
注意类型要匹配哦!
在判断两个list内容是否相同时,经常时比较地址,而非内容。
比如
//进行的是地址判重而非内容判重
if(item_table.containsKey(can_item)){
return;
}
而 HashMap 又是内部类,不方便重写hashode() 和 equals()方法。所以,如何判断两个list中的内容是否相同呢?
首先介绍一下别人的方法
//判断的方法list
private boolean isListEqual(List<String> l0, List<String> l1) {
boolean flag1 = l0.containsAll(l1);
boolean flag2 = l1.containsAll(l0);
return flag1 && flag2;
}
写个demo来调用
@Test
public void test02() {
String s = "0,1,2,3,4";
List<String> s1 = Arrays.asList(s.split(","));
String b = "1,2,3,4,0,";
List<String> s2 = Arrays.asList(b.split(","));
boolean flag = this.isListEqual(s1, s2);
System.out.println("==============>>>>>>>>>" + flag);
}
控制台显示运行结果:true
原文链接:https://blog.csdn.net/Odada1710/article/details/84324205
接下来运用到自己的算法函数中
/**
* @Description: 判断两个list内容是否相同(无序)
* @input:
* item_table 存放项集信息的列表
* can_item 新生成并输入的项集
***************************************************
* 在进行操作时,比较can_item是否包含在item_table的 keyset()中,
* 也就是判断item_table中是否已经包含有can_item这个项的信息
* @return:
* ture: item_table包含can_item(两个list相同);
* false:item_table不包含can_item(两个list不相同)。
*/
public boolean judge(HashMap<ArrayList<Integer>, ItemTable> item_table, ArrayList<Integer> can_item){
//判断两个list内容是否相同(无序)
for(ArrayList<Integer> can_item_temp : item_table.keySet()){
// if(can_item_temp.stream().allMatch()){
if(can_item_temp.containsAll(can_item)&&can_item.containsAll(can_item_temp)){
return true;
}
}
return false;
}
/* TODO 【test6】比较两个list的内容是否相等 */
public static void test6(){
ArrayList<Integer> list1 = new ArrayList<>();
ArrayList<Integer> list2 = new ArrayList<>();
ArrayList<Integer> list3 = new ArrayList<>();
//无内容时
System.out.println("list1.equals(list2) : " + list1.equals(list2)); //true
System.out.println("list3.equals(list2) : " + list1.equals(list3)); //true
list1.add(1); list1.add(2); list1.add(3);
list2.add(1); list2.add(2); list2.add(3);
list2.add(2); list2.add(1); list2.add(3);
//有内容时,比较地址
System.out.println("list1.equals(list2) : " + list1.equals(list2)); //false
System.out.println("list3.equals(list2) : " + list1.equals(list3)); //false
//list1.containsAll(list2) && list2.containsAll(list1)) : 无顺序
System.out.println("list1.containsAll(list2) && list2.containsAll(list1) : " + (list1.containsAll(list2) && list2.containsAll(list1))); //true
System.out.println("list1.containsAll(list3) && list1.containsAll(list3) : " + (list1.containsAll(list3) && list1.containsAll(list3))); //true
//list元素存在重复
ArrayList<Integer> list4 = new ArrayList<>();
list4.add(1); list4.add(2); list4.add(3); list4.add(3);
ArrayList<Integer> list5 = new ArrayList<>();
list5.add(3); list5.add(1); list5.add(2); list5.add(2);
System.out.println("list1.containsAll(list4) && list2.containsAll(list5) : " + (list1.containsAll(list4) && list2.containsAll(list5))); //true
System.out.println("list1.containsAll(list4) && list2.containsAll(list1) : " + (list1.containsAll(list4) && list2.containsAll(list1))); //true
数组相等的条件为:
1.数组元素个数相等
2.两个数组对应位置的元素也相等
Arrays.equals(int[]a1, int[]a2);
int[] a1 ={12, 56, 42};
int[] a2 =new int[3]; //元素相同,顺序相同
a2[0] = 12;
a2[1] = 56;
a2[2] = 42;
int[] a3 = {42, 56, 12}; //a3元素和a1相同,顺序不同
System.out.println(Arrays.equals(a1, a2)); //true
System.out.println(Arrays.equals(a1, a3)); //flase