答:我们可以用正则表达式来定义复杂的字符串格式,(\d{17}[0-9a-zA-Z]|\d{14}[0-9a-zA-Z])可以用来判断是否为合法的15位或18位***号码。
因为15位和18位的***号码都是从7位到第12位为***为日期类型。这样我们可以设计出更精确的正则模式,使***号的日期合法,这样我们的正则模式可以进一步将日期部分的正则修改为[12][0-9]{3}[01][0-9][123][0-9],当然可以更精确的设置日期。
在jdk的java.util.Regex包中有实现正则的类,Pattern和Matcher。以下是实现代码:
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegexTest {
/**
* @param args
*/
publicstatic void main(String[] args) {
//测试是否为合法的***号码
String[]strs = { "130681198712092019", "13068119871209201x",
"13068119871209201","123456789012345", "12345678901234x",
"1234567890123"};
Patternp1 = Pattern.compile("(\\d{17}[0-9a-zA-Z]|\\d{14}[0-9a-zA-Z])");
for(int i = 0; i < strs.length; i++) {
Matchermatcher = p1.matcher(strs[i]);
System.out.println(strs[i]+ ":" + matcher.matches());
}
Patternp2 = Pattern.compile("\\d{6}(\\d{8}).*"); // 用于提取出生日字符串
Patternp3 = Pattern.compile("(\\d{4})(\\d{2})(\\d{2})");// 用于将生日字符串进行分解为年月日
for(int i = 0; i < strs.length; i++) {
Matchermatcher = p2.matcher(strs[i]);
booleanb = matcher.find();
if(b) {
Strings = matcher.group(1);
Matchermatcher2 = p3.matcher(s);
if(matcher2.find()) {
System.out
.println("生日为" + matcher2.group(1) +"年"
+matcher2.group(2) + "月"
+matcher2.group(3) + "日");
}
}
}
}
}
答:
packagecn.itcast;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
public class MainClass{
publicstatic void main(String[] args) throws Exception{
FileManagera = new FileManager("a.txt",new char[]{'\n'});
FileManagerb = new FileManager("b.txt",new char[]{'\n',' '});
FileWriterc = new FileWriter("c.txt");
StringaWord = null;
StringbWord = null;
while((aWord= a.nextWord()) !=null ){
c.write(aWord+ "\n");
bWord= b.nextWord();
if(bWord!= null)
c.write(bWord+ "\n");
}
while((bWord= b.nextWord()) != null){
c.write(bWord+ "\n");
}
c.close();
}
}
class FileManager{
String[]words = null;
intpos = 0;
publicFileManager(String filename,char[] seperators) throws Exception{
Filef = new File(filename);
FileReaderreader = new FileReader(f);
char[]buf = new char[(int)f.length()];
intlen = reader.read(buf);
Stringresults = new String(buf,0,len);
Stringregex = null;
if(seperators.length>1 ){
regex= "" + seperators[0] + "|" + seperators[1];
}else{
regex= "" + seperators[0];
}
words= results.split(regex);
}
publicString nextWord(){
if(pos== words.length)
returnnull;
returnwords[pos++];
}
}
(大家正在做上面这道题,网上迟到的朋友也请做做这道题,找工作必须能编写这些简单问题的代码!)
答:listFiles方法接受一个FileFilter对象,这个FileFilter对象就是过虑的策略对象,不同的人提供不同的FileFilter实现,即提供了不同的过滤策略。
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FilenameFilter;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
public class Jad2Java {
publicstatic void main(String[] args) throws Exception {
FilesrcDir = new File("java");
if(!(srcDir.exists()&& srcDir.isDirectory()))
thrownew Exception("目录不存在");
File[]files = srcDir.listFiles(
newFilenameFilter(){
publicboolean accept(File dir, String name) {
returnname.endsWith(".java");
}
}
);
System.out.println(files.length);
FiledestDir = new File("jad");
if(!destDir.exists())destDir.mkdir();
for(Filef :files){
FileInputStream fis = new FileInputStream(f);
StringdestFileName = f.getName().replaceAll("\\.java$", ".jad");
FileOutputStreamfos = new FileOutputStream(new File(destDir,destFileName));
copy(fis,fos);
fis.close();
fos.close();
}
}
privatestatic void copy(InputStream ips,OutputStream ops) throws Exception{
intlen = 0;
byte[]buf = new byte[1024];
while((len= ips.read(buf)) != -1){
ops.write(buf,0,len);
}
}
}
由本题总结的思想及策略模式的解析:
1.
class jad2java{
1.得到某个目录下的所有的java文件集合
1.1得到目录 FilesrcDir = new File("d:\\java");
1.2得到目录下的所有java文件:File[] files =srcDir.listFiles(new MyFileFilter());
1.3只想得到.java的文件: class MyFileFilter implememytsFileFilter{
publicboolean accept(File pathname){
returnpathname.getName().endsWith(".java")
}
}
2.将每个文件复制到另外一个目录,并改扩展名
2.1得到目标目录,如果目标目录不存在,则创建之
2.2根据源文件名得到目标文件名,注意要用正则表达式,注意.的转义。
2.3根据表示目录的File和目标文件名的字符串,得到表示目标文件的File。
//要在硬盘中准确地创建出一个文件,需要知道文件名和文件的目录。
2.4将源文件的流拷贝成目标文件流,拷贝方法独立成为一个方法,方法的参数采用抽象流的形式。
//方法接受的参数类型尽量面向父类,越抽象越好,这样适应面更宽广。
}
分析listFiles方法内部的策略模式实现原理
File[] listFiles(FileFilter filter){
File[]files = listFiles();
//ArraylistacceptedFilesList = new ArrayList();
File[]acceptedFiles = new File[files.length];
intpos = 0;
for(Filefile: files){
booleanaccepted = filter.accept(file);
if(accepted){
//acceptedFilesList.add(file);
acceptedFiles[pos++]= file;
}
}
Arrays.copyOf(acceptedFiles,pos);
//return(File[])accpetedFilesList.toArray();
}
答:
首先要了解中文字符有多种编码及各种编码的特征。
假设n为要截取的字节数。
publicstatic void main(String[] args) throws Exception{
Stringstr = "我a爱中华abc我爱传智def';
Stringstr = "我ABC汉";
intnum = trimGBK(str.getBytes("GBK"),5);
System.out.println(str.substring(0,num));
}
publicstatic int trimGBK(byte[] buf,int n){
intnum = 0;
booleanbChineseFirstHalf = false;
for(inti=0;i<n;i++)
{
if(buf[i]<0&& !bChineseFirstHalf){
bChineseFirstHalf= true;
}else{
num++;
bChineseFirstHalf= false;
}
}
returnnum;
}
答:哈哈,其实包含中文字符、英文字符、数字字符原来是出题者放的***。
String content = “中国aadf的111萨bbb菲的zz萨菲”;
HashMap map = new HashMap();
for(int i=0;i<content.length;i++)
{
charc = content.charAt(i);
Integernum = map.get(c);
if(num== null)
num= 1;
else
num= num + 1;
map.put(c,num);
}
for(Map.EntrySet entry : map)
{
system.out.println(entry.getkey()+ “:” + entry.getValue());
}
估计是当初面试的那个学员表述不清楚,问题很可能是:
如果一串字符如"aaaabbc中国1512"要分别统计英文字符的数量,中文字符的数量,和数字字符的数量,假设字符中没有中文字符、英文字符、数字字符之外的其他特殊字符。
int engishCount;
int chineseCount;
int digitCount;
for(int i=0;i<str.length;i++)
{
charch = str.charAt(i);
if(ch>=’0’ && ch<=’9’)
{
digitCount++
}
elseif((ch>=’a’&& ch<=’z’) || (ch>=’A’ && ch<=’Z’))
{
engishCount++;
}
else
{
chineseCount++;
}
}
System.out.println(……………);