java经典编程事例.doc_第1页
java经典编程事例.doc_第2页
java经典编程事例.doc_第3页
java经典编程事例.doc_第4页
java经典编程事例.doc_第5页
已阅读5页,还剩23页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

经典编程小事例反射与正则 1. 给一个ArrayList集合中添加一个字符串数据,并显示* 思路:1,获取这个集合的字节码对象 然后通过Class对象获取该集合对象. * 2.再用Class对象获取集合的add方法对象Method * 3.再把class对象与添加的字符串当参数传给Method的方法invoke.import java.lang.reflect.Method;import java.util.ArrayList;import java.util.List;public class Test public static void main(String args) throws Exception List list = new ArrayList();Class cls = list.getClass();ArrayList obj =(ArrayList)cls.newInstance();Method mt = cls.getMethod(add,Object.class);mt.invoke(obj, String);/obj.add(String);这样则无法编译通过System.out.println(obj);2. 通过配置文件运行类中的方法import java.io.FileInputStream;import java.lang.reflect.Method;import java.util.Properties;/* * 思路: * 1,先将文件写入字节流,然后将字节流写入Properties集合中 * 2,通过getProperties方法获取方法名和类名 * 3,再通过类名获取其class对象 * 4.通过对象和方法名获取其方法 */public class Test public static void main(String args) throws ExceptionFileInputStream file = new FileInputStream(Show.txt);Properties pro = new Properties();pro.load(file);file.close();/通过键值对获取对应的类名和方法名String className = pro.getProperty(className);String methodName= pro.getProperty(methodName);/通过反射获得字节码对象和方法对象Class cls = Class.forName(className);Object obj =cls.newInstance();Method mt = cls.getMethod(methodName,null);/方法一定要公用public/如果是getDeclaredMethod,则也可以获取非公有方法/如果方法私用,那么要先暴力破解:mt.setAccessible(true);mt.invoke(obj,null);3.随即输入QQ号:校验QQ号码:不能以0开头 是5-15位的数字import java.util.Scanner; * * 思路:用正则定义规范,再用String类的匹配方法match方法判断时否正确public class Test public static void main(String args) Scanner sc = new Scanner(System.in);String qq = sc.nextLine();String segex =00-94,14;boolean flag= qq.matches(segex);if (flag) System.out.println(qq);elseSystem.out.println(输入格式错误);4. 邮件校验/String regex = a-zA-Z_0-9+a-zA-Z_0-9+(.a-zA-Z_0-9+)+;/用w改写规则w表示:单词字符:a-zA-Z_0-9 /反斜杠的用法:当在字符串中,表示转义,所以要表示明确意思要用两个反斜杠String regex = w+w+(.w+)+;boolean flag = eamil.matches(regex);System.out.println(flag);5.将字符串还原成:“我要学编程”。如:我.我.要.String s = 我我.我.我.要.要要.要学.学学.学.编.编编.编.程.程.程.程;String regex = .+;/先把点去掉s=s.replaceAll(regex, );System.out.println(s);s=s.replaceAll(.)1+, $1);/再去叠词,注意:这里$1表示前面(.)1内的值,也就是任意值.()是组意思System.out.println(s);6.能将这些ip地址排序。按照地址段数值从小到大排序。3 4思路:* ip地址都是字符串,所有字符串排序,用TreeSet。* 如果用TreeSet现在存在每个ip地址,就会有问题。因为有部分ip没有满足三位。* 这样比较是有问题的, 所有,我们采取补位的方式。* 1:先给每个ip地址的每一个位在前面补2个0。* 2:把超出3位的数据,截取成3位。*/public class Test public static void main(String args) String str = 3 4;/ 先补2个0str = str.replaceAll(d+), 00$1);System.out.println(str);/ 去除超出3位的前面的0str = str.replaceAll(0*(d3), $1);System.out.println(str);/ 切割String ips = str.split( );/ 我遍历这个字符串数组,把每个数据添加到TreeSet集合中。TreeSet ts = new TreeSet();for (String s : ips) ts.add(s);/ System.out.println(s);/System.out.println(ts);/最后遍历集合,把前面的0干掉for(String s : ts)s = s.replaceAll(0*(d+), $1);System.out.println(s);网络编程:1.模拟Tcp协议的传输过程 */public class Test public static void main(String args) throws IOException /定义客户端端口Socket s = new Socket(11,10086);/定义读取键盘输入的流BufferedReader br = new BufferedReader(new InputStreamReader(System.in);OutputStream in = s.getOutputStream();PrintWriter pw = new PrintWriter(in,true);/定义读取服务器的字符流BufferedReader br1 = new BufferedReader(new InputStreamReader(s.getInputStream();String s1=null;/写入服务器while(s1=br.readLine()!=null) if (over.equals(s1)break;pw.println(s1);/读取服务器写入的数据String s3= br1.readLine();System.out.println(s3);pw.close();br.close();s.close();服务器端public static void main(String args) throws IOException /定义服务器接收端口ServerSocket ss = new ServerSocket(10086);/或取服务器Socket接口Socket s = ss.accept();/获取读取客户端的流BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream();/定义输出客户端数据的流PrintWriter pw=new PrintWriter(System.out,true);/获取反馈输出客户端的流PrintWriter pw2=new PrintWriter(s.getOutputStream(),true);/写入客户端数据到控制台String str =null;while(str=br.readLine()!=null)pw.println(str);/反馈回数据到客户端pw2.println(收到);ss.close();s.close();2. 模拟UDP协议做一个聊天工具创建接收端与发送端发送端设立端口,用字符缓冲流读取数据打包发送接收端设立接收端口,接收数据包,用包的方法解析包的数据,打印到控制台/创建发送服务端DatagramSocket ds = new DatagramSocket();/ 创建键盘录入对象,并用转换流进行转换后高效处理BufferedReader bs= new BufferedReader(new InputStreamReader(System.in);String s =null;while(s=bs.readLine()!=null)/ 把每一行的数据进行封装byte bye =s.getBytes();DatagramPacket dp = new DatagramPacket(bye,bye.length,InetAddress.getByName(fada-pc),11111);/打包发送ds.send(dp);ds.close();bs.close();/ 创建接收端的服务DatagramSocket ds = new DatagramSocket(11111);/ 用循环接收数据while (true) / 定义一个容器接收数据,把这个容器传递给数据包byte bye = new byte1024;/ 调用接收方法接受数据DatagramPacket dp = new DatagramPacket(bye, bye.length);ds.receive(dp);/ 解析数据String ip = dp.getAddress().getHostAddress();String text = new String(dp.getData(), 0, dp.getLength();/ 打印数据System.out.println(ip + - + text);3. 如何通过主机q或IP文本,获取IP和电脑名称主要运用InetAddress类和其下面的getByName getHostAdddress getHostName方法public static void main(String args)throws UnknownHostException InetAddress id1 = InetAddress.getByName(fada-pc);InetAddress id = InetAddress.getByName(11);String ip = id.getHostAddress();String name = id.getHostName();System.out.println(ip+-+name);System.out.println(id1.getHostAddress()+-+id1.getHostName();IO流1. 要求获取一个程序运行的次数,如果满足5次,那么该程序退出,请给出注册的提示,并结束思路: *1:定义计数器记录程序的运行次数。 *由于这个次数如果是记录在程序中,那么程序结束,下次再开始运行,记录次数又重头开始。 *所以,我们需要把次数记录在一个文件中。 *2:每次我们可以从一个文件中读取一个次数,进行判断,看我们的程序是否还可以运行。 *如果可以,就让程序继续,否则,提示要注册。 *3:假如一个文件中,只记录一个数字没什么意义。所以,我们采用键值对的方式记录。 *这样呢,我们就考虑到了Properties这个对象。 */public class Test public static void main(String args) try boolean flag = runCount();if (!flag) System.out.println(请拿钱注册);return; catch (IOException e) e.printStackTrace();System.out.println(开始玩游戏.);System.out.println(玩游戏.);System.out.println(结束玩游戏.);/ 每次读取文件,获取键值对中的值进行判断,如果大于5次就改真假值。public static boolean runCount() throws IOException boolean flag = true;/ 定义一个属性文件(.properties, .ini xml)File countFile = new File(perties);/ 判断文件是否存在,如果不存在就创建文件if (!countFile.exists() countFile.createNewFile();/ 定义我们记录数据的格式:count=值Properties prop = new Properties();/ 把数据从文件中加载到集合中FileInputStream fis = new FileInputStream(countFile);prop.load(fis);fis.close();/ 通过键获取值int num = 0;String value = prop.getProperty(count);if (value != null) num = Integer.parseInt(value);if (num = 5) flag = false;num+;/ 设置值prop.setProperty(count, num + );/ 把集合中的数据重新写回文件FileOutputStream fos = new FileOutputStream(countFile);prop.store(fos, null);fos.close();return flag;2.实现一个包装类,让读出的每一行自动加上行号和:号public class Test2 extends BufferedReader private int lineNumber;public Test2(Reader r) super(r);public String myReadLine() throws IOException lineNumber+;if (super.readLine()!=null) return lineNumber+:+super.readLine();elsereturn null;3.*需求:把Properties.txt中键为count的值改为100 *读出到Properties集合-用load()方法 *再从转化成set集合遍历出count键,再用getProperty写入新值 *再用list或store方法写放到文件中*/public class Test public static void main(String args) throws IOException FileInputStream fs = new FileInputStream(Properties.txt);Properties pp = new Properties();pp.load(fs);fs.close();System.out.println(pp);Set set =pp.keySet();Set set1 =pp.stringPropertyNames();for (Object obj:set) String s =(String)obj;if(s.equals(count)pp.setProperty(s, 100+);PrintWriter pw = new PrintWriter(new FileWriter(Properties.txt),true);pp.list(pw);pw.close();4.键盘输入转大写在控制台显示public static void main(String args) throws IOException BufferedReader br = new BufferedReader(new InputStreamReader(System.in);PrintWriter pw = new PrintWriter(System.out,true);String line = null;while(line=br.readLine()!=null)pw.println(line.toUpperCase();br.close();pw.close();5.用字符缓冲流复制一张图片并记算花费时间.public static void main(String args) throws IOException BufferedInputStream br = new BufferedInputStream(new FileInputStream(c:纳木错.jpg);BufferedOutputStream pw = new BufferedOutputStream(new FileOutputStream(D:纳木错.jpg);int line=0;long l1 =System.currentTimeMillis();byte bye = new byte1024;while(line=br.read(bye)!=-1)pw.write(bye);pw.flush();long l2 =System.currentTimeMillis();System.out.println(l2-l1);br.close();pw.close();6. 自己模拟BufferedReader对象/思路:我们现在其实底层调用的还是Reader的读操作。/而Reader一次可以读取一个字符,我们得想办法一行的字符组合起来并返回。/每次获取一个字符,组合起来,这样的话,就要求有一个容器来存储每次读到的单个字符。/请问?用哪个容器。通过思考最终选择了StringBuilderpublic class MyBufferedReader /private FileReader fr; /这里我不仅仅是对文件对象进行功能的增强private Reader r;public MyBufferedReader(Reader r)this.r = r;/模拟一次读取一行数据的方法public String myReadLine() throws IOExceptionStringBuilder sb = new StringBuilder();/读取字符数据怎么判断是一行结束呢?在windows中是rnint ch = 0;while(ch=r.read()!=-1)/如果是r则继续读取一个字符,看是不是n如果是就把这个sb转成字符串返回。if(ch=r)continue;if(ch=n)return sb.toString();elsesb.append(char)ch);/如果不是rn数据,就把数据添加到sb上。/假如文本文件中的数据最后没有换行,可以采用这种方式解决读不到最后一行的问题if(sb.length()0)return sb.toString();return null;/模拟关闭方法public void myClose() throws IOExceptionr.close();递归:1.一头母羊的寿命是5年,它会在第2年底和第4年底各生下一头母羊,第5年底死去,问一开始农场有1头母羊,N年后,农场会有多少只母羊?public static int getSheeps(int n) / sheeps表示整个羊的生态圈ArrayList sheeps = new ArrayList();sheeps.add(new Sheep();List addSheeps = new ArrayList();/ 待添加到生态圈的新羊List delSheeps = new ArrayList();/ 待从生态圈删除的羊for (int i = 1; i = n; i+) for (Sheep s : sheeps) s.age+;if (s.age = 2 | s.age = 4) / 羊仍存活addSheeps.add(new Sheep(); else if (s.age = 5) / 羊死亡,加入删除列表delSheeps中,等待删除delSheeps.add(s);sheeps.addAll(addSheeps);sheeps.removeAll(delSheeps);addSheeps.clear();/ 清空addSheepsdelSheeps.clear();/ 清空待删除列表中的元素return sheeps.size(); / 最后总羊数即羊生态圈中的羊数目递归:public static int get(int year) int num=1; /The initial sheep number for(int i=1; i=year; i+) if(i=2) num+=get(year-2); else if(i=4) num+=get(year-4); else if(i=5) num-; return num; 2.将某个目录(含子目录和文件的)下所有的以java结尾的文件的路径存储到一个文本文件中思路: * 1:指定目录。 * 2:就可以使用递归的方式获取该目录下所有的文件对象,然后进行判断。 * 如果是以java结尾的文件,我就把该文件对象存储在集合中。 * 3:遍历集合对象,获取每个文件对象,把它的绝对路径用流的方式写入到文本文件中。File f = new File(E:Java0813-毕);ArrayList array = new ArrayList();getJava(f, array);PrintWriter pw = new PrintWriter(new FileWriter(java.txt), true);for (File s : array) System.out.println(s);pw.println(s.getName();private static void getJava(File f, ArrayList array) File fi =f.listFiles();for (File file:fi) if (file.isDirectory() getJava(file,array);elseif (file.getName().endsWith(.java) array.add(file);3.* 求5的阶乘。递归的问题: * 1:递归的次数不能过多。 * 2:递归必须有结束条件。递归出口。 * 5*4*3*2*1public static int getTotal(int m) /m=5if(m=1)return 1;elsereturn m*getTotal(m-1);4.斐波纳契数列:* 1,1,2,3,5,8,13,21.* 递归的出口:第一项和第二项的值都是1 a b * 递归的表达式:第三项开始:是前两项之和 a+b */public static int getFib(int m)if(m=1 | m=2)return 1;elsereturn getFib(m-1)+getFib(m-2);集合:1.去除ArrayList集合中的重复元素。思路:用contains方法去判断,定义一个新集合去装,public static ArrayList getSingletonCollection(ArrayList array) ArrayList al = new ArrayList();for (int x = 0; x array.size(); x+) String str = (String) array.get(x);/判断al中是否包含某个元素,如果不包含,则把元素加入al.if (!al.contains(str) al.add(str);return al;2.自定义比较器,实现按照Worker的姓名的长度进行比较 */public class CompareByLength implements Comparator public int compare(Worker w1, Worker w2) int x = 0;if (w1.getName().length() w2.getName().length() x = 1; else if (w1.getName().length() = w2.getName().length() x = 0; else if (w1.getName().length() w2.getName().length() x = -1;return x;3.在方法上应用自定义泛型class General / 打印Tpublic void show(T t) System.out.println(t);public class Test2 public static void main(String args) General g = new General();g.show(aaa);g.show(new Integer(20);print(bbb);print(new Integer(30);int in =1,2,3;print(in);public static void print(Q q) System.out.println(q);4.把集合中的字符串按照长度进行排序/定义一个比较器class StringCompareByLength implements Comparator public int compare(String s1, String s2) int num = s1.length()-s2.length(); /int compareTo 按字典顺序比较两个字符串。相等返回0 return num=0?pareTo(s2):num;public class HashSetTest public static void main(String args) TreeSet hs = new TreeSet(new StringCompareByLength();hs.add(hehe);hs.add(haha);hs.add(abcd);hs.add(hel);hs.add(itcast);hs.add(ok);hs.add(hehe);Iterator it = hs.iterator();while (it.hasNext() String str = it.next();System.out.println(str);05.将字符串中的数值进行排序后,生成一个字符串。98 -1 23 0 8 14 首先的说一下:这个字符串数值之间肯定有分隔。 1:把字符串切割成字符串 2:把切割后的字符串数组变成int数组 3:对int数组进行排序 4:把int数组转成字符串public static void main(String args) String str = 98 -1 23 0 8 14;/ 使用切割把字符串变成了字符串数组String strArray = str.split( );/ 定义一个int类型数组int arr = new intstrArray.length;/ 把字符串数组变成int数组for (int x = 0; x arr.length; x+) arrx = Integer.parseInt(strArrayx);/ 对int数组进行排序Arrays.sort(arr);/ 把int数组百变成字符串StringBuilder builder = new StringBuilder();for (int x = 0; x arr.length; x+) if (x != arr.length - 1) builder.append(arrx).append( ); else builder.append(arrx);String ss = builder.toString();System.out.println(ss);06:*随机获取该字符串中,每一个字母出现的次数。要求打印结果是:a(2)b(1).一一对应的值:Map下面的集合 a 2,b 1. 发现这个a,b如果作为键,我们要求键是排序的,那么综合以上两点,选择使用TreeMap */public class TreeMapTest public static void main(String args) Scanner sc = new Scanner(System.in);String str = sc.nextLine();TreeMap tm = stringToMap(str);System.out.println(treeMapToString(tm); /返回类型:TreeMap 未知内容:字符串public static TreeMap stringToMap(String str) TreeMap tm = new TreeMap();/ 把字符串变成字符数组char ch = str.toCharArray();for (int x = 0; x ch.length; x+) char key = chx;Integer i = tm.get(key);/key是Character类型的.有一个自动装箱的过程.if (i = null) tm.put(key, 1); else i+;/ i = i + 1 有一个拆箱的过程,还有一个装箱的过程.tm.put(key, i);return tm;/把TreeMap转型成一个字符串返回 a(2)d(1)f(4)s(3)public static String treeMapToString(TreeMap tm)StringBuilder builder = new StringBuilder();Set set = tm.keySet();Iterator it = set.iterator();while(it.hasNext()Character c = it.next();Integer i = tm.get(c);builder.append(c).append().append(i).append();return builder.toString();07.让集合按比较器或自然顺序排序学习如何自已通过实现比较器接口和实现自然排序接口按自已需要排序List list=new ArrayList();list.add(new Book(2,thinking in c+,tom,89.9);list.add(new Book(1,thinking in java,tom,89.7);list.add(new Book(3,thinking in ruby,tom,49.9);Collections.sort(list,Collections.reverseOrder();/list集合中元素现在有自然顺序,第二参数的作用是/反转原来的自然顺序Collections.sort(list);/list集合中元素的自然顺序/Collections.sort(list,new BookComparator(); /list集合中的元素按照比较器指定方式排序/使用比较器 价格 比较器关健是,给定条件,反回正数,则在其右,返回负数,则在其左,返回0则不存,因为set不可以存重复数组class BookComparator implements Comparatorpublic int compare(Book b1,Book b2)if(b1.price-b2.price0)return 1;else if(b1.price-b2.price0)return -1;elsereturn 0;/让Book类有自然顺序 idclass Book implements Comparableint id;String name;String author;double price;Book(int id,String name,String author,double price)this.id=id;=name;this.author=author;this.price=price;public int compareTo(Book b)return this.id-b.id;public String toString()return ID:+id+ NAME:+name+ AUTHOR:+author+ PRICE:+price;08.重写hashcode值和equals方法来维护其

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论