2013-04-11 18 views
0

的ArrayList的 制作一个新的ArrayList 我作为 从bean类

的Java Bean由五个领域的bean类的ArrayList - MyShares

  1. 文件名
  2. 文件路径
  3. fileSize
  4. isShared
  5. 创建者

我想从这个ArrayList的bean类

的文件路径做一个ArrayList的,我没有在Java集合渊博知识。那么,这将是最短的逻辑。

我所实现的本逻辑低于,现在我想要优化的逻辑这样做

ArrayList<Myshares> fileDetails = new ReadSDCard().getSdCardFiles(); 

     if (!fileDetails.isEmpty()) { 

      for (int i = 0; i < fileDetails.size(); i++) { 
       CommonUtilities.filePaths.add(fileDetails.get(i).getPath()); 
      } 
     } 

     if (!CommonUtilities.filePaths.isEmpty()) { 

      for (int i = 0; i < CommonUtilities.filePaths.size(); i++) { 

       Log.d(Integer.toString(i), CommonUtilities.filePaths.get(i)); 
      } 
     } 

CommonUtilities.filePaths是我在我要存储文件路径的ArrayList静态

+0

你的问题是什么? – Joetjah 2013-04-11 11:25:54

+0

@Joetjah请参阅我的更新后文章 – 2013-04-11 11:27:47

+1

使用for-each('for(Myshares share:fileDetails)')而不是基于索引的迭代。然后你不需要检查列表是否为空。 – Kai 2013-04-11 11:29:09

回答

0

林struggeling理解为什么你会有两个循环。一个循环遍历fileDetails集合并将路径添加到新集合,然后循环访问新集合以进行日志记录。不要在同一回路这两个步骤:

if (!fileDetails.isEmpty()) { 

     for (int i = 0; i < fileDetails.size(); i++) { 
      CommonUtilities.filePaths.add(fileDetails.get(i).getPath()); 
      Log.d(Integer.toString(i), fileDetails.get(i).getPath()); 
     } 
    } 

其他然后,我看不出这可能是最佳演示,因为这是不可能的路径添加到新阵列,而不通过一个与fileDetails循环。此逻辑将运行在O(n)时间

+0

你应该缓存'fileDetails。在局部变量中获取(i).getPath()'以避免调用它两次。 – Kai 2013-04-11 11:46:07

+0

@John Snow我为了某种目的使用了两个for循环。我必须在那里写一些代码。通过任何方法我们不能提取一个字段的值意味着单行代码中的文件路径,而不是循环 – 2013-04-11 11:53:07

+0

那么,这种微调并不是真的值得。对垃圾收集器处理额外的局部变量的调用并没有什么不同。它还需要多一行代码才能获得性能增益 – 2013-04-11 11:54:32

1

你在做什么很好,但你需要在插入CommonUtilities.filePaths之前检查路径是否为null。你也可以使用迭代器而不是for循环。

您可以可避免两个for循环,只是做到以下几点:

ArrayList<Myshares> fileDetails = new ReadSDCard().getSdCardFiles(); 
     int j=0; 

     if (!fileDetails.isEmpty()) { 
      for (int i = 0; i < fileDetails.size(); i++) { 
       if(fileDetails.get(i).getPath()!=null){ 
       CommonUtilities.filePaths.add(fileDetails.get(i).getPath()); 
       Log.d(Integer.toString(j), CommonUtilities.filePaths.get(j)); 
       j++; 
       } 
      } 
     } 
+0

如果它给出null – 2013-04-11 11:53:49

+0

@Nikhil我只是建议检查null,因为您真的想添加null因为'CommonUtilities.filePaths'将包含空值,并且如果您尝试使用元素在其他地方你会得到NullPointerException,所以最好在插入之前检查数据是否为空,因为ArrayList可以包含空值。 Plus'Log.d(Integer.toString(j),CommonUtilities.filePaths.get(j));'如果你没有检查空值,将会记录空值。 – Lakshmi 2013-04-12 05:36:14

+0

是的,但是为了这个目的,我创建了一个检查空函数,它检测数据类型,然后检查是否为null,如果为null,则为其指定一个真值。在这里,我问了我的问题,有人对我投了赞成票。人们必须指定他们为什么downvoting的原因 – 2013-04-12 05:39:40

0

为什么再次使用CommonUtilities来获取文件路径?我们可以在同一个实例,而迭代

ArrayList<Myshares> fileDetails = new ReadSDCard().getSdCardFiles(); 

      if (!fileDetails.isEmpty()) { 

       for (int i = 0,n=fileDetails.size(); i < n; i++) { 

        CommonUtilities.filePaths.add(fileDetails.get(i).getPath()); 
       Log.d(Integer.toString(i),fileDetails.get(i).getPath()); 
       } 
      } 

请参阅构建日志的路径:

for (int i = 0,n=fileDetails.size(); i < n; i++) 

我们可以利用这一点,提供,我们相信,fileDetails.size()将返回相同的结果(列表没有被修改)。 这将节省我们从每次调用fileDetails.size()每次