BUC算法的java实现

本文介绍了一种名为BUC的算法实现,该算法主要用于从CSV文件中读取数据,并通过统计不同维度的数据频率来筛选出满足最小支持度要求的项集。文章详细展示了如何定义BUC类、读取数据文件、获取数据维度以及处理数据等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

import java.util.ArrayList;
import java.util.Arrays;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

public class BUC {
    private String [][] dataSet;
    private ArrayList<String>  dimension;
    private ArrayList<String> inputList;
    private ArrayList<String> removeList;
    private Integer minSup;


    public BUC(int rank, int col,Integer minSup, String filename) {
        this.dataSet = new String[rank][col];
        this.dimension = new ArrayList<String>();
        this.minSup = minSup;
        this.inputList = new ArrayList<String>();
        this.removeList = new ArrayList<String>();
        this.readFile(filename);
        this.getDimension();
        this.getOutput(0);
    }
    //读取csv数据到dataSet里面
    public void readFile(String filename){
        File inFile = new File(filename); // 读取的CSV文件
        String inString = "";
        try {
            BufferedReader reader = new BufferedReader(new FileReader(inFile));
            inString = reader.readLine();
            String [] tempRank = null;
            for(int i=0;inString!=null;i++){
                tempRank = inString.split(",");
                for(int j=0;j<tempRank.length;j++){
                    this.dataSet[i][j] = tempRank[j];
                }
                inString=reader.readLine();
            }
            reader.close();
        } catch (FileNotFoundException ex) {
            System.out.println("没找到文件!");
        } catch (IOException ex) {
            System.out.println("读写文件出错!");
        }
    }
    //获取数据有几个维度,即有几个a,b,c,d。。。
    public void getDimension(){
        for(int i=0;i<this.dataSet.length;i++){
            for(int j=0;j<this.dataSet[i].length;j++){
                if(check(String.valueOf(this.dataSet[i][j].charAt(0)))){
                    this.dimension.add(String.valueOf(this.dataSet[i][j].charAt(0)));
                }
            }
        }
        System.out.println("文件的含有的dimension有:  "+this.dimension.toString());
    }

    //获取数据有几个维度,即有几个a,b,c,d。。。
    public ArrayList<String> getDimension(ArrayList<String> a){
        for(int i=0;i<this.dataSet.length;i++){
            for(int j=0;j<this.dataSet[i].length;j++){
                if(check(this.dataSet[i][j],a)){
                    a.add(this.dataSet[i][j]);
                }
            }
        }
        System.out.println("该行的含有的dimension有:  "+a.toString());
        return a;
    }

    //获取数据有几个维度,即有几个a,b,c,d。。。
    public ArrayList<String> getDimension(ArrayList<String> a,Integer k){
        if(k>this.dataSet[0].length){
            return null;
        }else {
            for(int i=0;i<this.dataSet.length;i++){
                for(int j=0;j<=this.dataSet[i].length-k;j++){
                    String tmp = "";
                    for(int m=j;m<j+k;m++){
                        tmp = tmp + this.dataSet[i][m];
                    }
                    if(check(tmp,a)){
                        a.add(tmp);
                    }
                }
            }
        }
        System.out.println("该行的含有的dimension有:  "+a.toString());
        System.out.println("要去掉的关系有         :"+this.removeList.toString());
        for(int i=0;i<a.size();i++){
            for(int j=0;j<this.removeList.size();j++){
                if(a.get(i).contains(this.removeList.get(j))){
                    a.set(i,"");
                }
            }
        }
        ArrayList<String> endSet = new ArrayList<String>();
        for(int i=0;i<a.size();i++){
            if(a.get(i).equals("")){
                continue;
            }
            endSet.add(a.get(i));
        }
        a = endSet;
        System.out.println("该行的含有的dimension有:  "+a.toString());
        return a;
    }
    //查看是否重复,用于维度的工具函数
    public boolean check(String index,ArrayList<String> t){
        boolean flag = true;
        for(int i=0;i<t.size();i++){
            if(t.get(i).equals(index)){
                flag = false;
                break;
            }
        }
        return flag;
    }
    //查看是否重复,用于维度的工具函数
    public boolean check(String index){
        boolean flag = true;
        for(int i=0;i<this.dimension.size();i++){
            if(String.valueOf(this.dimension.get(i).charAt(0)).equals(index)){
                flag = false;
                break;
            }
        }
        return flag;
    }

    public void getProcess(int dim){
        System.out.println("当前维度是: "+dim);
        if(dim==1){
            ArrayList<String> tempSet = new ArrayList<String>();
            this.getDimension(tempSet);
            Integer [] SetCount = new Integer[tempSet.size()];
            for(int i=0;i<this.dataSet.length;i++){
                for(int j=0;j<this.dataSet[i].length;j++){
                    for(int k=0;k<tempSet.size();k++){
                        if(tempSet.get(k).equals(this.dataSet[i][j])){
                            if(SetCount[k]==null){
                                SetCount[k]=1;
                            }else {
                                SetCount[k] = SetCount[k] + 1;
                            }
                        }
                    }
                }
            }
            System.out.println("该行的dimension频数为 :   "+Arrays.toString(SetCount));
            for(int i=0;i<SetCount.length;i++){
                if(SetCount[i]>=this.minSup){
                    this.inputList.add(tempSet.get(i)+"<"+SetCount[i]+">");
                }else {
                    this.removeList.add(tempSet.get(i));
                }
            }
        }else {
            ArrayList<String> tempSet = new ArrayList<String>();
            tempSet = this.getDimension(tempSet,dim);
            this.removeList = new ArrayList<String>();
            Integer [] SetCount = new Integer[tempSet.size()];
            for(int i=0;i<this.dataSet.length;i++){
                for(int j=0;j<=this.dataSet[i].length-dim;j++){
                    String tmp = "";
                    for(int m=j;m<j+dim;m++){
                        tmp = tmp + this.dataSet[i][m];
                    }
                    for(int k=0;k<tempSet.size();k++){
                        if(tempSet.get(k).equals(tmp)){
                            if(SetCount[k]==null){
                                SetCount[k]=1;
                            }else {
                                SetCount[k] = SetCount[k] + 1;
                            }
                        }
                    }
                }
            }
            System.out.println("该行的dimension频数为 :   "+Arrays.toString(SetCount));
            for(int i=0;i<SetCount.length;i++){
                if(SetCount[i]>=this.minSup){
                    this.inputList.add(tempSet.get(i)+"<"+SetCount[i]+">");
                }else {
                    this.removeList.add(tempSet.get(i));
                }
            }
            System.out.println("输出结果为:"+this.inputList.toString());
        }
    }
    //工作函数
    public void getOutput(int dim){
        if(dim<this.dimension.size()){
            dim = dim + 1;
            this.getProcess(dim);
            getOutput(dim);
        }
    }
    public static void main(String[] args){
    //此处需要手动输入行数和列数,案例是15行4列
        BUC buc = new BUC(15,4,4,"C:\\Users\\14983\\Desktop\\BUC_Experiment\\src\\BUC数据集.csv");
    }
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值