如何用java实现从大批文件中筛选 phone number的设计,说明设计思路? 多谢啊...大批量文件怎么实现才是做好的... 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 实现的方式很多这要看实现的目标,是要低CPU还是短时间,还是其他什么目标 能说一下分别对于低CPU和短时间.都有什么实现方法吗? 在檔案內找到某字串的問題不難,但如果用轉成字串然後用 contains或 indexOf等方式去檢查的話,就必須考慮字串落在兩次讀取之間的情形,以及轉字串的時間。這是我以前寫的,你的問題蠻適用的。(沒空寫一個 PhoneNumberChacker,但規則類似,你可以參考我下面兩個checker自己寫。)public static void main(String[] args) { try{ long s = (new Date()).getTime(); FileInputStream fi = new FileInputStream(new File("fileName")); //要檢查的檔案 StringChecker sc = new StringChecker("xxxxx"); //要檢查的字串 byte[] bytes=new byte[64768]; int ct=0; int x = 0; outter: while((ct = fi.read(bytes))>0){ for(int i=0;i<ct;i++){ if(sc.check((char)bytes[i])){ System.out.println("Found at :"+(x*64768+i)); //實際位置要減去字串長度才對 //break outter; //如果找到就不往下找,可以設中斷。 } } x++; } fi.close(); //實測結果 1.5G的檔案約 30秒 System.out.println("Time:"+((new Date()).getTime() - s)); }catch(Exception e){ e.printStackTrace(); }}主要規則:每次檢查一個字元,如果相符,則檢查位置加一,如果不相符,則檢查位置歸零。如果檢查位置比檢查字串還大,表示全字串相符,回傳true,並將檢查位置歸零,否則回傳 false。public class StringChecker { private int checkIndex = 0; private String pattern; public StringChecker(String pattern){ this.pattern=pattern; } public boolean check(char c) { if(pattern.charAt(checkIndex) == c){ checkIndex++; }else{ checkIndex=0; } if(checkIndex==pattern.length()){ checkIndex=0; return true; }else{ return false; } } }不分大小寫可以這樣做。public class IgnoreCaseStringChecker{ private int checkIndex = 0; private String pattern_upper; private String pattern_lower; public StringChecker(String pattern){ this.pattern_upper=pattern.toUpperCase(); this.pattern_lower=pattern.toLowerCase(); } public boolean check(char c) { if(pattern_upper.charAt(checkIndex) == c || pattern_lower.charAt(checkIndex)==c){ checkIndex++; }else{ checkIndex=0; } if(checkIndex==pattern_lower.length()){ checkIndex=0; return true; }else{ return false; } } } 在JAVA中怎么用 MessageDigest实现MD5的加密? 很恶心的泛型问题 怎样求当前日期前一年的时间 double类型四舍五入取两位小数,java中程序怎样写? 请高手指点怎么样获得系统的时间,要求这个时间在改变时区的时候也保持一致,谢谢。。 关于IBM全球认证(websphere)的问题!![散分] switch(exception)case 中 exception的值为String类型怎么出错,怎样转换成基本类型 ? 新手的问题 如何使一个file表示当前的目录? 如何知道任意给定一周是从哪天开始的? 在线高分请教Junit的问题,请大家不吝赐教 数组问题
能说一下分别对于低CPU和短时间.都有什么实现方法吗?
就必須考慮字串落在兩次讀取之間的情形,以及轉字串的時間。這是我以前寫的,你的問題蠻適用的。
(沒空寫一個 PhoneNumberChacker,但規則類似,你可以參考我下面兩個checker自己寫。)public static void main(String[] args) {
try{
long s = (new Date()).getTime();
FileInputStream fi = new FileInputStream(new File("fileName")); //要檢查的檔案
StringChecker sc = new StringChecker("xxxxx"); //要檢查的字串
byte[] bytes=new byte[64768];
int ct=0;
int x = 0;
outter:
while((ct = fi.read(bytes))>0){
for(int i=0;i<ct;i++){
if(sc.check((char)bytes[i])){
System.out.println("Found at :"+(x*64768+i)); //實際位置要減去字串長度才對
//break outter; //如果找到就不往下找,可以設中斷。
}
}
x++;
}
fi.close();
//實測結果 1.5G的檔案約 30秒
System.out.println("Time:"+((new Date()).getTime() - s));
}catch(Exception e){
e.printStackTrace();
}
}
主要規則:
每次檢查一個字元,如果相符,則檢查位置加一,如果不相符,則檢查位置歸零。
如果檢查位置比檢查字串還大,表示全字串相符,回傳true,並將檢查位置歸零,否則回傳 false。public class StringChecker {
private int checkIndex = 0;
private String pattern;
public StringChecker(String pattern){
this.pattern=pattern;
}
public boolean check(char c) {
if(pattern.charAt(checkIndex) == c){
checkIndex++;
}else{
checkIndex=0;
}
if(checkIndex==pattern.length()){
checkIndex=0;
return true;
}else{
return false;
}
}
}
不分大小寫可以這樣做。public class IgnoreCaseStringChecker{
private int checkIndex = 0;
private String pattern_upper;
private String pattern_lower;
public StringChecker(String pattern){
this.pattern_upper=pattern.toUpperCase();
this.pattern_lower=pattern.toLowerCase();
}
public boolean check(char c) {
if(pattern_upper.charAt(checkIndex) == c || pattern_lower.charAt(checkIndex)==c){
checkIndex++;
}else{
checkIndex=0;
}
if(checkIndex==pattern_lower.length()){
checkIndex=0;
return true;
}else{
return false;
}
}
}