题目比较基础,不是很难,但也有很多需要注意的地方,先看题目吧:
1.找出目录中最大的文件。(目录中可能会有子目录)
2.有两个大小分别为m,nL的容器,如何获得xL的水?
package others; import java.io.File; import java.io.ObjectInputStream.GetField; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Map.Entry; //找出目录中最大的文件 public class FileManager { Map<String,Long> fileMap=new HashMap();//保存文件的路径及对应的文件大小 public void getMaxSizeFile(String path){ File file=new File(path); if(file.isDirectory()){ bianli(file);//通过遍历把文件路径及对应大小保存到fileMap中 }else System.out.println("the path should be a directory!"); Long maxSize=0L;//文件最大值 List result=new ArrayList();//保存结果 ,最大的文件可能不止一个 for(Iterator it=fileMap.entrySet().iterator();it.hasNext();){ Entry en=(Entry) it.next(); Long size=(Long) en.getValue(); if(size>=maxSize){ if(size!=maxSize)result.clear();; maxSize=size; result.add(en.getKey()); } } for(Iterator it=result.iterator();it.hasNext();) System.out.println(it.next()); } private void bianli(File file) { // TODO Auto-generated method stub File[] files=file.listFiles(); if(files==null)return; for(File f:files){ if(f.isDirectory())bianli(f); else { fileMap.put(f.getAbsolutePath(), f.length()); } } } public static void main(String[] args) { // TODO Auto-generated method stub FileManager manager=new FileManager(); long start=System.currentTimeMillis(); manager.getMaxSizeFile("C:\\"); System.out.println("花费:"+(System.currentTimeMillis()-start)); } }
第一种思路是用一个map先把所有的文件名和大小保存起来,再从中找最大值,写的过程中就想到可以不用map,直接用一个中间变量保存最大值,效率会高些。但最后测试的结果表示,效率并没提高多少,当然空间肯定是节省了。
package others; import java.io.File; import java.io.ObjectInputStream.GetField; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Map.Entry; //找出目录中最大的文件 public class FileManager2 { Long max=0L; ArrayList result=new ArrayList(); public void getMaxSizeFile(String path){ File file=new File(path); if(file.isDirectory()){ bianli(file);//通过遍历把文件路径及对应大小保存到fileMap中 }else System.out.println("the path should be a directory!"); for(Iterator it=result.iterator();it.hasNext();) System.out.println(it.next()); } private void bianli(File file) { // TODO Auto-generated method stub File[] files=file.listFiles(); if(files==null)return; for(File f:files){ if(f.isDirectory())bianli(f); else { if(f.length()>max){ max=f.length(); result.clear(); result.add(f.getAbsolutePath()); }else if(f.length()==max)result.add(f.getAbsolutePath()); } } } public static void main(String[] args) { // TODO Auto-generated method stub FileManager manager=new FileManager(); long start=System.currentTimeMillis(); manager.getMaxSizeFile("C:\\"); System.out.println("花费:"+(System.currentTimeMillis()-start)); } }
第二题有很多需要注意的地方,可以看注释
package others; /** * 有两个大小分别为m,nL的容器,如何获得xL的水? 如4,3 2 */ public class WaterTest { private int i=1;//倒水次数记数 public boolean doWater(int m, int n, int x) { int left, right; if (x > m + n || (m == n && m != x)) { System.out.println("can't get " + x + "L water"); return false; } left = m;// M杯剩余水量 System.out.println(i+++":M杯倒满:" + m + "L水"); if (left == x) return true; right = n;// N杯空余空间 while (right > 0) { left = m - right;// 左边还剩多少水 System.out.println(i+++":从M杯倒" + right + "L水到N杯中,最后M杯中剩" + left + "L水"); if (left == x) return true; while (left > right) { System.out.println(i+++":把N杯中的水全问倒掉"); right = n; System.out.println(i+++":把M杯中剩下的" + left + "L水倒满N杯,M杯中还剩余水" + (left - n) + "L"); left = left - n; if (left == x) return true; } System.out.println(i+++":把N杯中的水全问倒掉"); right = n - left; System.out.println(i+++":把M杯中剩下的" + left + "L水倒到N杯中,N杯剩余空间" + right + "L"); left = m; System.out.println(i+++":M杯倒满:"+m+"L水"); // right=left<right?n-left:left-n;//右边还剩多少空间 if (n == (right + x)) return true; } return false; } public static void main(String[] args) { // 10,4,3 false // 4,3,2 true // 20,3,2 true //20,7,5 true WaterTest test=new WaterTest(); if (test.doWater(20,7,5)) { System.out.println("胜利完成!"); } else System.out.println("不能实现!"); } }