3、 输入一个文件系统的子目录,编程序将其中的所有内容的名字输出到console上,要求:
a、使用泛型的动态数组作为工具;
b、使用课本193页的File对象及其方法;
c、将此子目录下的所有子目录(可能有很多层)及其中的所有文件的文件名输出;
d、输出目录名和文件名时,用前缀空格显示出层次关系;
import java.io.*;
import java.util.ArrayList;
public class OpenFile
{
public static void main(String[] args)
{
// TODO Auto-generated method stub
File myFile=new File("D:\\Study\\Java\\Test6Q6");//需要打开的目录
ArrayList<File> files=new ArrayList<File>();//用于顺序存放目录下的内容
int blank=0;//用于前缀输出
ArrayList<Integer> blanks=new ArrayList<Integer>();//与files链表相对应,每一个文件对应一个前缀
if(!myFile.exists())
{
System.out.println("输入的目录不存在!");
return;
}
files.add(myFile);
blanks.add(blank);
for(int i=0;i<files.size();i++)//遍历files链表中的每一个结点
{
if(files.get(i).isDirectory())//判断结点是否为文件夹
{
blank=blanks.get(i)+2;//该文件夹下的所有内容,前缀都会多两个空格,以便区分从属关系
File[] childFiles=files.get(i).listFiles();//将该文件夹下的所有内容放进childFiles数组里
for(int j=0;j<childFiles.length;j++)
{
files.add(i+j+1,childFiles[j]);//注意,把childFiles数组里的元素按序接在了父文件的后边,保证files链表的有序性
blanks.add(i+j+1,blank);
}
}
}
for(int i=0;i<files.size();i++)
{
for(int j=0;j<blanks.get(i);j++)
{
System.out.print(" ");
}
System.out.print("-"+files.get(i).getName());
System.out.println();
}
}
}
5、 选择泛型集合类中的链表类,用此类:a、随机产生100个整数(范围自定)的链表,在生成的过程中从小到大排列,然后输出;b、随机产生100个6个英文字母的单词的链表,在生成的过程中从小到大排列,然后用链表方式输出。
import java.util.LinkedList;//引入 LinkedList类
public class Sort
{
public static void main(String[] args)
{
// TODO Auto-generated method stub
LinkedList<Integer> myIntLink= new LinkedList<Integer>();
int firstIntLinkNode=(int)(Math.random()*(100));
myIntLink.addLast(firstIntLinkNode);//使用 addLast()在尾部添加元素
for(int i=0;i<100;i++)
{
int random=(int)(Math.random()*(100));
int j=0;
while(j<i+1)
{
if(random<myIntLink.get(j))//使用get()返回指定位置的元素
{
break;//此时j即为插入位置
}
j++;
}
myIntLink.add(j,random);//使用add()向指定位置插入元素
}
for(int i=0;i<100;i++)
{
System.out.print(String.format("%1$ 3d",myIntLink.get(i))+" ");
if((i+1)%10==0)
{
System.out.println();
}
}
LinkedList<StringBuffer> myStringLink= new LinkedList<StringBuffer>();
StringBuffer firstStringLinkNode=new StringBuffer();
for(int i=0;i<6;i++)
{
int num=(int)(Math.random()*26);
firstStringLinkNode.append((char)('a'+num));
}
myStringLink.addLast(firstStringLinkNode);
for(int i=0;i<100;i++)
{
StringBuffer random=new StringBuffer();
for(int j=0;j<6;j++)
{
int num=(int)(Math.random()*26);
random.append((char)('a'+num));
}
int j=0;
while(j<i+1)
{
if(random.toString().compareTo(myStringLink.get(j).toString())<0)//使用get()返回指定位置的元素
{
break;//此时j即为插入位置
}
j++;
}
myStringLink.add(j,random);//使用add()向指定位置插入元素
}
for(int i=0;i<100;i++)
{
System.out.print(myStringLink.get(i)+" ");
if((i+1)%10==0)
{
System.out.println();
}
}
}
}
4、 设计一个小英汉词典,其中英文单词的个数为30(单词可自己任选),编程序,从键盘输入单词,程序将单词的中文解释输出,若没有找到,则输出:not found in our dictionary!
import java.util.*;
import java.util.Scanner;
public class Dictionary
{
public static void main(String[] args)
{
// TODO Auto-generated method stub
HashMap<String, String> dict=new HashMap<String,String>();
dict.put("abandon","遗弃");
dict.put("alter","改变");
dict.put("consume","消耗");
dict.put("split","分裂");
dict.put("transform","转变");
dict.put("vain","徒劳");
dict.put("stimulate","激励");
dict.put("wander","漫游");
dict.put("abuse","滥用");
dict.put("ruin","毁灭");
dict.put("route","路线");
dict.put("delay","推迟");
dict.put("tend","趋向");
dict.put("ultimate","最终");
dict.put("excess","过量");
dict.put("grant","授予");
dict.put("invade","入侵");
dict.put("calculate","计算");
dict.put("interfere","介入");
dict.put("hook","钩子");
dict.put("ban","禁止");
dict.put("capture","俘虏");
dict.put("exploit","剥削");
dict.put("poverty","贫穷");
dict.put("debt","欠债");
dict.put("scandal","丑闻");
dict.put("focus","聚焦");
dict.put("scan","扫描");
dict.put("decade","十年");
dict.put("valley","山谷");
System.out.println("词典含以下30个单词:");
for(String s:dict.keySet())
{
System.out.print(s+" ");
}
System.out.println();
Scanner scan=new Scanner(System.in);
boolean flag=true;
while(flag)
{
menu();
int choice=scan.nextInt();
switch(choice)
{
case 1:
System.out.println("请输入您要查询的英文单词:");
String queryWord=scan.next();
if(dict.get(queryWord)!=null)
{
System.out.println(queryWord+":"+dict.get(queryWord));
}
else
{
System.out.println("该单词不存在词典中");
}
break;
case 2:
flag=false;
System.out.println("已退出词典");
break;
default:
break;
}
}
}
public static void menu()
{
System.out.println("请选择以下操作:");
System.out.println("1.查询单词");
System.out.println("2.退出词典");
}
}
- 接口/抽象类 通过本次实验,我对抽象类的运用有了更深入的了解。在法1中,父类Animal中的两个方法并没有实际的使用起来,而只是为了重载而不得不写上方法体,而学会了抽象类就能很好地解决这个问题。在Animal类中不需要给出这两个方法的具体实现,而是在它的四个子类中提供自己的实现,使得设计更加清晰,效率更高。
通过本次实验,我对接口的运用有了更深入的了解。既然Bird,Insect,Reptile,Fish都必须实现showType与showTalent两个方法,那就可以直接在接口中写上这两个方法,然后在四个类中去实现该接口,注意接口中只进行方法的声明,而不提供方法的实现。 - 比较器 经过本次实验,我对两种类型的比较器有了更深的认识。Comparable(内部排序) int compareTo(Object obj),返回值为int,默认升序排序;Comparator(外部排序) int
compare(Object ob1,Object
obj2),返回值为int,排序灵活。若一个类实现了Comparable(排序接口)接口,就意味着该类支持排序存放该类的Collection或数组,可以直接通过Collection.sort()或着Arrays.sort进行排序;Comparator接口是比较器接口,类本身不支持排序,专门由若干个第三方的比较器(实现了Comparator接口的类)来进行类的排序,是一个外部比较器,但是此方法排序的方式更加灵活多变,可以自己设定。重要的是,Comparable在要比较的对象的类中实现,可以比较该对象和另一个对象,而Comparator在一个单独的类中实现,可以比较任意两个对象。 - 目录输出 通过本次实验,我对File类中的成员方法有了进一步认识,比如本题中用到的isDirectory(),就是检查一个对象是否是文件夹/目录;listFiles()方法返回的是一个File类的引用,它具有类的所有属性和方法,能够获取当前文件夹下的所有文件和文件夹,即如果文件夹A下还有文件D,那么D也会被返回。
- 英汉词典 在本次实验中,我体会到了HashMap类的方便。有了键-值,让本题中英汉对应的操作变得十分简单;同时,HashMap的成员方法,比如本题中用到的put(),get()都十分实用,特别是get()方法,用于获取指定
key 对应对的value,让查找与输出的代码与思路都变得十分简洁。 - LinkedList类 经过本次实验,我深刻体会到了java中集合类的方便实用。在上一次实验中,面对一样的问题,我使用了两个指针,去实现链表的查找以及插入,而在这次的实验中,我在查看LinkedList类的成员方法时,惊喜地发现了public
void add(int index, E element)——向指定位置插入元素,以及public E get(int
index)——返回指定位置的元素,从而大大简化了代码的书写,也让我想去了解更多的集合类,以及它们的成员方法。 - 文件输入输出 在本次实验中,一是对java中IO知识有了更深的理解,明白输入输出流的含义,本来不太清楚的节点流与过滤流,在完成实验的过程中也有了进一步的认识,同时学会了文件的读写;二是加深对异常处理的try,catch,final操作的理解。