我的一个题目就是寻找大量数据的规律
比如有10000条数据,我要循环统计以每个字符的前N个字符开头的所有数据的个数
下面是我写的,但是处理好多数据时会很慢很慢,请各位看看有没优化的方法,或者说是其他方法,麻烦各位帮忙想想class AnalysisThread extends Thread {
//判断是进行header还是tail的分析 true为header false为tail
private boolean isH_T = true;
private String flag;
private long start;
private long end;
private MyRandomAccessFile  randomAccessFile;
private BufferedReader bufferedReader;
private Hashtable<String, Integer> table;
private boolean isFinished = false;
public AnalysisThread(BufferedReader bufferedReader,long start,long end,String threadName,Hashtable<String, Integer> table,boolean isH_T) {
super(threadName);
this.bufferedReader = bufferedReader;
this.start = start;
this.end = end;
this.table = table;
this.isH_T = isH_T;
if(this.isH_T) {
flag = "HEAD";
}else {
flag = "TAIL";
}
logger.process("线程:"+threadName+"  初始化开始执行");
}

@Override
public void run() {
long bytesCount = 0;
System.out.println("当前"+Thread.currentThread().getName()+"任务"+start+"~"+end);
String token = null;
String dataTemplate = null;
try {
bufferedReader.skip(start);
while((dataTemplate=bufferedReader.readLine())!=null) {
bytesCount += dataTemplate.getBytes().length+1;
if(dataTemplate.length()==0) {
System.out.println("_______________-----------------------------------___________________________");
continue;
}
// dataTemplate = StringFeature.getId(dataTemplate);
logger.process(Thread.currentThread().getName()+"当前模版字符串:"+dataTemplate);
if(bytesCount+start>=end) {
logger.process(Thread.currentThread().getName()+" : 结束");
isFinished = true;
break;
}
for(int i=checkTemplate(dataTemplate, table);i<dataTemplate.length();i++) {
if(isH_T) {
token = dataTemplate.substring(0, i);
}else {
token = (dataTemplate.substring(dataTemplate.length()-i, dataTemplate.length()));
}
if(table.containsKey(token))
continue;
int count = 0;
String tmp = null;
BufferedReader bufferedReader = new BufferedReader(new FileReader(new File(filepath)));
while((tmp=bufferedReader.readLine())!=null) {
// tmp = StringFeature.getId(tmp);
if(isH_T) {
if(tmp.charAt(0)!=token.charAt(0))
continue;
if(isFixedHeader(tmp, token))
count++;
}else {
if(tmp.charAt(tmp.length()-1)!=token.charAt(token.charAt(token.length()-1)))
continue;
if(isFixedTail(tmp, token))
count++;
}
}
if(count>1) {
if(!table.containsKey(token)) {
table.put(token, count);
logger.process(Thread.currentThread().getName()+"[put] "+flag+":\t"+token+" \t\t--> COUNT:\t "+count);
}
}
}
}
} catch (IOException e) {
e.printStackTrace();
}
isFinished = true;
}

/**
 * 扫描所有字符串是否为
 * 有固定字符串头的
 * @param filepath <p> 需要扫描的字符串输入流文件地址</p>
 * @param string <p>需要扫描的字符串</p>
 * @return <p>true:有固定的字符串头 false:没有固定的字符串头</p>
 */
public boolean isFixedHeader(String string,String header) {
if(string.length()<header.length()) {
return false;
}
if(string.substring(0, header.length()).equals(header))
return true;
else
return false;
}

/**
 * 扫描这个字符串是否为
 * 有固定字符串 尾的
 * @param string <p>需要扫描的字符串</p>
 * @param tail <p>当前要匹配的tail</p>
 * @return <p>true:有固定的字符串尾 false:没有固定的字符串尾</p>
 */
public boolean isFixedTail(String string,String tail) {
if(string.length()<tail.length())
return false;
if(string.endsWith(tail))
return true;
else
return false;
}

public boolean isFinished() {
return isFinished;
}
} public int checkTemplate(String tempplate,Hashtable<String, Integer> hashtable) {
for(int i=1;i<tempplate.length();i++) {
if(!hashtable.containsKey(tempplate.substring(0, i).trim())) {
return i;
}
}
return 1;
}