题目比较基础,不是很难,但也有很多需要注意的地方,先看题目吧:
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("不能实现!");
}
}