Java基础部分8

算法与编程

1.判断***:要么是15位,要么是18位,最后一位可以为字母,并写程序提出其中的年月日。

答:我们可以用正则表达式来定义复杂的字符串格式,(\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],当然可以更精确的设置日期。

jdkjava.util.Regex包中有实现正则的类,PatternMatcher。以下是实现代码:

 

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) + "");

                            }

                     }

 

              }

 

       }

 

}

 

1、编写一个程序,将a.txt文件中的单词与b.txt文件中的单词交替合并到c.txt文件中,a.txt文件中的单词用回车符分隔,b.txt文件中用回车或空格进行分隔。

答:

              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++];

       }

 

}

 

1、编写一个程序,将d:\java目录下的所有.java文件复制到d:\jad目录下,并将原来文件的扩展名从.java改为.jad

大家正在做上面这道题,网上迟到的朋友也请做做这道题,找工作必须能编写这些简单问题的代码!

答: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();

      

}

1、编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串,但要保证汉字不被截取半个,如“我ABC”,4,应该截取“我AB”,输入“我ABCDEF”,6,应该输出“我ABC”,而不是“我ABC+汉的半个”。

答:

       首先要了解中文字符有多种编码及各种编码的特征。

    假设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;

       }

1、有一个字符串,其中包含中文字符、英文字符和数字字符,请统计和打印出各个字符的个数。

答:哈哈,其实包含中文字符、英文字符、数字字符原来是出题者放的***。

String content = “中国aadf111bbb菲的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(……………);


你可能感兴趣的:(Java基础部分8)