A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 史卜坤 中级黑马   /  2012-7-1 09:23  /  1330 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

import java.util.*;
import java.io.*;
//需求:1.将指定目录下的java文件的绝对的路径名存入一个集合中。
    //2.再将集合中的文件目录取出存入一个指定的文件中。
public class Glc
{

public static void main(String[] args)throws IOException
{
  File fy = new File("D:\\Dem");
  List<File> list = new ArrayList<File>();
  di(fy,list);
  System.out.println(list.size());
  File f = new File(fy,"javalist.txt");
  xie(f.toString(),list);
  
  
  
}
public static void di(File fy,List<File> list)
{
  File[] fi = fy.listFiles();
  for(File fiu:fi)
  {
   if(fiu.isDirectory())
    di(fiu,list);
   else
   {
    if(fiu.getName().endsWith(".java"))
     list.add(fiu);
   }
  }
}
public static void xie(String javalist,List<File> list)throws IOException
{
  BufferedWriter buf = null;
  try
  {
   
   buf = new BufferedWriter(new FileWriter(javalist));
   
   for(File f:list)//为什么这个高级for循环用的循环条件是File对象????这个函数中传入的参数不是集合对象(List<File> list)吗.
                   //File对象不用从集合中取出就可以直接用吗???
   {
    String s = f.getAbsolutePath();
    buf.write(s);
    buf.newLine();
    buf.flush();
   
   
   }
  }
  catch(IOException e)
  {
   throw e;
  }
  finally
  {
   try
   {
    if(buf!= null)
     buf.close();
   }
   catch(IOException e)
   {
    throw e;
   }
  }
   
  
}
}


5 个回复

倒序浏览
for(File f:list)//为什么这个高级for循环用的循环条件是File对象????这个函数中传入的参数不是集合对象(List<File> list)吗.
                    //File对象不用从集合中取出就可以直接用吗???

因为List<File> list已经表明集合里的元素都是File类型,所以循环里的条件是File对象。
回复 使用道具 举报
你已经将泛型参数都写进去了xie(String javalist,List<File> list)这就好像定义了一个List<String> list = new ArrayList<String>();然后你遍历的时候肯定循环条件是for(String s :list)
是一样的道理 ,你的泛型已经被参数化了
回复 使用道具 举报
遍历的意思就是将集合或数组中的元素一一看一遍,要就取出,不要就放那儿不管。
for(File f//遍历的对象的类型,for循环不一定要元素本身才可以,元素的自身属性也能遍历。

:list //被遍历的集合或数组
  {
    String s = f.getAbsolutePath();
    buf.write(s);//将遍历的对象的路径写入指定文件
    buf.newLine();
    buf.flush();
   
   
   }
for增强就好比打牌,要哪两张就抽那两张,你打牌的时候不可能去数第几张,第几张。
所以它不能排序。
普通for就是先给每个元素编个号码,对号入座。然后你要第几个就喊个号码就好了。

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

回复 使用道具 举报
  1. for(File f:list)//为什么这个高级for循环用的循环条件是File对象????这个函数中传入的参数不是集合对象(List<File> list)吗.
  2.                     //File对象不用从集合中取出就可以直接用吗???
复制代码
1.首先,高级for循环(也就是foreach循环)这种for循环的内部是调用了Iterator实现的(实现了Iterator接口),和Iterator遍历效果是一样(你可以断点调试跟踪代码看看内部原理),主要用于遍历数组、集合的每一个元素。所以楼主的“File对象不用从集合中取出就可以直接用吗”问题的到解决。
2.其次增强for循环的格式:
(数据类型 变量名:被遍历的集合(Collection)或者数组)
楼主已经写了“,List<File> list”就是说集合的对象都是File类。这涉及到泛型,等到楼主看完高薪技术的泛型后就会明白了。

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

回复 使用道具 举报
for(File f:list)//为什么这个高级for循环用的循环条件是File对象????这个函数中传入的参数不是集合对象(List<File> list)吗.
                   //File对象不用从集合中取出就可以直接用吗???
   {
    String s = f.getAbsolutePath();
    buf.write(s);
    buf.newLine();
    buf.flush();
   
   
   }
楼组你好,正如你所说的为什么for中的类型回事file,首先我给你大概的说下,原因就在于你之前在定义list的时候是这样的
List<File> list = new ArrayList<File>();你在list的定义上加了泛型,也就是你这个list只能存放file对象.你之前也用过Iterator来遍历list的吧,给你举个例子吧List<User> list =new ArrayList();//这个list加了泛型User,我现在想遍历list取出每个对象
Iterator it=list.iterator();//利用list中的Iterator()方法实现Iterator接口。
while(it。hasnext()){//遍历这个list
  //这个时候你如果你加强制转换将list的元素转换成User类型,直接用it.next()输出的话,输出的会是一个内存地址,所以你要想得到User元素中的值,就必须强制转换回User
User u=(User)it.next();//这样你就可以取出User中的元素了
}
从上边这个例子你可以看出如果你加了泛型,想要得要他的值 的话就必须强制转换回泛型的类型。这种转换在使用Iterator遍历的时候是需要自己强制去转换的,而在使用roreach这样的高级for循环中就必须在前边便利的类型中指定为泛型的类型。所以你必须得要用file类型

评分

参与人数 1技术分 +1 收起 理由
职业规划-刘倩老师 + 1 赞一个!

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马