<pre name="code" class="java">import java.io.BufferedReader;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
public class Apriori {
public int find(List<String> list,String str){ //函数作用:查找str,在list出现的次数,其中str中的所有元素均出现在list.get(i)字符串中,才记作一次
String[] str_content=str.split(" ");
int count=0;
String tmp="";
Iterator<String> It = list.iterator();
while(It.hasNext()){
tmp=It.next();
String[] tmp_content=tmp.split(" ");
for(int i=0;i<str_content.length;i++){
int find_str_content_i=0;
for(int j=0;j<tmp_content.length;j++){
if(tmp_content[j].equals(str_content[i])){
find_str_content_i=1;
break;
}
}
if(find_str_content_i!=1){
break;
}
if(i==(str_content.length-1))
{count +=1;}
}
}
return count;
}
public Set<String> Connect(Set<String> set){ //函数作用:连接步,把输入的集合set中两两元素,如果具有 size-1项相同就才连接,生成一个size+1长度的新元素,加入输出的集合中
Set<String> set0=new HashSet<String>();
String[] set_content=new String[set.size()];
Iterator<String> It = set.iterator();
int i=0;
while(It.hasNext())
{set_content[i]=It.next();
//System.out.println(set_content[i]);
i=i+1;}
for(int j=0;j<(set.size()-1);j++){
for(int k=j+1;k<set.size();k++){
if(Cmp_str(set_content[j],set_content[k])!=null){
set0.add(Cmp_str(set_content[j],set_content[k]));
}
}
}
return set0;
}
private String Cmp_str(String str1, String str2) {//函数作用:判断str1与str2中是否有size-1项相同,是则连接为size+1的字符串,否则输出空值null
String return_str=null;
String[] str1_content=str1.split(" ");
String[] str2_content=str2.split(" ");
Set<String> set=new HashSet<String>();
for(int i=0;i<str1_content.length;i++){
set.add(str1_content[i]);
set.add(str2_content[i]);
}
if(set.size()==(str2_content.length+1)){
return_str="";
Iterator<String> It = set.iterator();
while(It.hasNext())
{
return_str=return_str+" "+It.next();
}
return_str=return_str.trim();
}
return return_str;
}
public Set<String> Prune(Set<String> set,int min_sup,List<String> list){ //函数作用:扫描list,将set中的元素,计数大于min_sup的元素,才添加到输出集合set0中
Set<String> set0=new HashSet<String>();
Iterator<String> It = set.iterator();
while(It.hasNext())
{ String tmp=It.next();
if(find(list,tmp)>=min_sup){
set0.add(tmp);
}
}
return set0;
}
public static void main(String[] args) throws IOException {
int min_sup=2;
BufferedReader br=new BufferedReader(new FileReader("F:/数据挖掘--算法实现/apriori算法/input.txt"));
String line="";
List<String> list=new ArrayList<String>();
Set<String> set=new HashSet<String>();
while((line=br.readLine())!=null){
list.add(line);
String[] content=line.split(" ");
for(int i=0;i<content.length;i++){
set.add(content[i]);
}
}
FileWriter fw=new FileWriter("F:/数据挖掘--算法实现/apriori算法/output.txt",true);
Apriori a=new Apriori();
while(!set.isEmpty())
{
set=a.Prune(set,min_sup,list);
Iterator<String> It = set.iterator();
while(It.hasNext())
{
String tmp=It.next();
fw.write(tmp+" "+String.valueOf(a.find(list,tmp))+"\r\n");
}
set=a.Connect(set);
//Iterator<String> It0 = set.iterator();while(It0.hasNext()){System.out.println(It0.next());}
}
fw.close();
}
}
输入:
I1 I2 I5
I2 I4
I2 I3
I1 I2 I4
I1 I3
I2 I3
I1 I3
I1 I2 I3 I5
I1 I2 I3
</pre><pre name="code" class="java">输出:
I1 6
I2 7
I3 6
I4 2
I5 2
I2 I5 2
I1 I3 4
I2 I4 2
I1 I2 4
I2 I3 4
I1 I5 2
I1 I2 I5 2
I1 I2 I3 2