马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
有代码与错误提示写的过程中是没有报错的
错误提示:
Exception in thread "main" java.lang.NullPointerException
at zuoye.AprioriAlgorithm.findF1Item(AprioriAlgorithm.java:83)
at zuoye.AprioriAlgorithm.main(AprioriAlgorithm.java:25)package zuoye;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.TreeSet;
public class AprioriAlgorithm {
private int minSup;
private int position;
private static List<String>date;
private static List<Set<String>>dataSet;
public static void main(String[] args) {
long startTime = System.currentTimeMillis();
AprioriAlgorithm apriori = new AprioriAlgorithm();
date = apriori.builDate();
apriori.setMinSup1(2);
date = apriori.builDate();
List<Set<String>>f1Set = apriori.findF1Item(date);
apriori.printSet(f1Set,1);
List<Set<String>>result = f1Set;
int i = 2;
do {
result = apriori.arioriGen(result);
apriori.printSet(result, 1);
i++;
}while(result.size() != 0);
long endTime = System.currentTimeMillis();
System.out.println("共用时:"+(endTime - startTime) + "ms");
}
public void setMinSup1(int minSup) {
this.minSup = minSup;
}
List<String> builDate(String...fileName){
List<String>data = new ArrayList<String>();
if(fileName.length != 0) {
File file = new File(fileName[0]);
try {
BufferedReader reader = new BufferedReader(new FileReader(file));
String line;
while((line = reader.readLine()) !=null) {
date.add(line);
}
}catch(FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}else {
data.add("I1 I2 I5");
data.add("I2 I4");
data.add("I2 I3");
data.add("I1 I2 T4");
data.add("I1 I3");
data.add("I2 I3");
data.add("I1 I3");
data.add("I1 I2 I3 I5");
data.add("I1 I2 I3");
}
dataSet = new ArrayList<Set<String>>();
Set<String>dSet;
for(String d : data) {
dSet = new TreeSet<String>();
String[] dArr = d.split("");
for(String str : dArr) {
dSet.add(str);
}
}
return date;
}
List<Set<String>>findF1Item(List<String>data){
List<Set<String>>result = new ArrayList<Set<String>>();
Map<String,Integer> dc = new HashMap<String,Integer>();
for(String d : data) {
String[] items = d.split("");
for(String item : items) {
if(dc.containsKey(item)) {
dc.put(item, dc.get(item)+1);
}else {
dc.put(item, 1);
}
}
}
Set<String>itemKeys = dc.keySet();
Set<String>tempKeys = new TreeSet<String>();
for(String str : itemKeys) {
tempKeys.add(str);
}
for(String item : tempKeys) {
if(dc.get(item)>= minSup) {
Set<String>f1Set = new TreeSet<String>();
f1Set.add(item);
result.add(f1Set);
}
}
return result;
}
List<Set<String>>arioriGen(List<Set<String>>preSet){
List<Set<String>>result = new ArrayList<Set<String>>();
int preSetSize = preSet.size();
for(int i = 0;i<preSetSize-1;i++) {
for(int j = i+1;j<preSetSize;j++) {
String[] strA1 = preSet.get(i).toArray(new String[0]);
String[] strA2 = preSet.get(j).toArray(new String[0]);
if(isCanLink(strA1,strA2)) {
Set<String>set = new TreeSet<String>();
for(String str : strA1) {
set.add(str);
}
set.add((String) strA2[strA2.length-1]);
if(!isNeedCut(preSet,set)) {
result.add(set);
}
}
}
}
return chckSupport(result);
}
List<Set<String>>chckSupport(List<Set<String>>setList){
List<Set<String>>result = new ArrayList<Set<String>>();
boolean flag = true;
int [] counter = new int [setList.size()];
for(int i =0;i<setList.size();i++) {
for(Set<String>dSets : dataSet) {
if(setList.get(i).size()>dSets.size()) {
flag = true;
}else {
for(String str : setList.get(i)){
if(!dSets.contains(str)) {
flag = false;
break;
}
}
if(flag) {
counter[i] += 1;
}else {
flag = true;
}
}
}
}
for(int i = 0;i<setList.size();i++) {
if(counter[i]>= minSup) {
result.add(setList.get(i));
}
}
return result;
}
boolean isCanLink(String[] s1,String[] s2) {
boolean flag = true;
if(s1.length == s2.length) {
for(int i = 0;i<s1.length-1;i++) {
if(!s1[i].equals(s2[i])) {
flag = false;
break;
}
}
if(s1[s1.length-1].equals(s2.length-1)) {
flag = false;
}
}else{
flag = true;
}
return flag;
}
boolean isNeedCut(List<Set<String>> setList, Set<String> set) {
boolean flag = false;
List<Set<String>>subSets = getSubset(set);
for(Set<String>subSet : subSets) {
if(!isContained(setList,subSet)) {
flag = true;
break;
}
}
return flag;
}
private boolean isContained(List<Set<String>> setList, Set<String> set) {
boolean flag = false;
int psoition = 0;
for(Set<String>s : setList) {
String[] sArr = s.toArray(new String[0]);
String[] setArr = set.toArray(new String[0]);
for(int i = 0;i<sArr.length;i++) {
if(sArr[i].equals(setArr[i])) {
position = i;
}else {
break;
}
}
if(position == sArr.length-1) {
flag = true;
position = 0;
}
}
return flag;
}
private List<Set<String>> getSubset(Set<String> set) {
List<Set<String>>result = new ArrayList<Set<String>>();
String[] setArr = set.toArray(new String[0]);
for(int i = 0;i<setArr.length;i++) {
Set<String>subSet = new TreeSet<String>();
for(int j = 0;j<setArr.length;j++) {
if(i!=j) {
subSet.add((String) setArr[j]);
}
}
result.add(subSet);
}
return null;
}
void printSet(List<Set<String>> setList, int i) {
System.out.println("频繁"+i+"项集:共"+setList.size()+"项:{");
for(Set<String>set : setList) {
System.out.print("[");
for(String str : set) {
System.out.print(str+"");
}
System.out.print("],");
}
System.out.println("}");
}
}
|