在for循环中创建多个对象

时间:2010-03-07 02:43:44

标签: java object loops

我的Java代码应该在for循环中创建多个对象,然后将每个对象添加到一个数组中。但是,一旦循环结束,代码就会将相同的(在for循环中最后一个)对象复制到数组中的每个索引 i 中。

如何更正这个以使每个单独的对象在数组中的正确索引中?

如果有必要,我可以发布代码,但如果有人能给我一个如何工作的例子会很好。

for (int i = 0; i < file.listFiles().length; i++) {
    if (fileList[i].isFile() && !fileList[i].isHidden() && fileList[i].getName().substring(fileList[i].getName().length() - 4).equalsIgnoreCase(".mp3")
            && !fileList[i].equals(null)) {
        try {
            songs.add(new Song(fileList[i]));
            //System.out.println(songs[i].getTitle());
            //playlistInfo[i] = fileList[i].getName();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (TagException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

这是我将一些对象信息打印到控制台的位置。

System.out.println(getSong(1).getTitle());
System.out.println(getSong(4).getTitle());

5 个答案:

答案 0 :(得分:0)

应该像

一样简单
for (int ii = 0; ii < yourArray.length; ii++) {
    yourArray[ii] = new YourObject();
}

如果没有看到您的代码,我们无法告诉您问题所在。

答案 1 :(得分:0)

您的代码

int i=1; i<file.listFiles().length-1

应该是

int i=0; i<file.listFiles().length

您从数组中的第二个元素开始(因为第一个元素为零)并且提前结束一个因为'&lt;'并且'-1'每个让你停止一个短的.length,总共2个短(并且因为数组基于零,你只想停一个短)。

答案 2 :(得分:0)

如果if条件的评估结果为true,则歌曲阵列中将包含空白项目。我建议使用ArrayList类,并在找到它们时将项目添加到那里:

List<Song> songs = new ArrayList<Song>();
for (int i=1; i<file.listFiles().length-1; i++) {
    if (fileList[i].isFile() && !fileList[i].isHidden() && fileList[i].getName().substring(fileList[i].getName().length()-4).equalsIgnoreCase(".mp3")) {
        songs.add(new Song(fileList[i]));
    }
}

我还建议你:

  • 使用方法File.listFiles获取符合给定条件的文件;在Commons IO项目的包org.apache.commons.io.filefilter中有一堆预定义的过滤器;
  • 在进行比较之前检查文件名长度,或者使用Commons IO库中的FilenameUtils.getExtension方法获取文件扩展名(您可能认为它有点矫枉过正,但是......);
  • 使用列表而不是数组;
  • 我不认为你对Song类的实例化很容易产生异常。更高级别的try ... catch块可能更合适。你对异常的处理是完全错误的,如果你不仅仅是简单地打印它的堆栈跟踪,那么最好不要抓住它。

关于你的问题,我不确定所有生成的对象是如何相同的,除非你的fileList数组在所有位置都包含相同的元素。

答案 3 :(得分:0)

用于创建Song个对象并将其分配给songs的代码基本上是正确的。你的问题在别处:

  • for语句几乎肯定是不正确的,数组的第一个元素的索引是0,最后一个元素的索引是array.length - 1。您正在从1迭代到array.length - 2

  • 如果在循环中遇到NullPointerException,很可能是因为fileListnull或者它包含null元素。

  • 如果fileList数组包含目录,隐藏文件或不匹配的文件,则songs数组将在相应位置具有null。这可能是NullPointerExceptions的原因...如果你在打印数组条目之前没有检查。

我注意到这段代码:

System.out.println(getSong(1).getTitle());
System.out.println(getSong(4).getTitle());

不会告诉您Song对象是相同还是不同。相反,它只会告诉您两个Song对象是否具有相同字符的标题。

这将告诉您Song对象是否不同:

if (getSong(1) != getSong(4)) {
    System.err.println("They are different");
}

答案 4 :(得分:0)

我已经纠正了这个问题。我的一些类变量是静态的,这导致在我的arraylist中的每个索引中创建新对象的问题。对于造成任何人的任何麻烦,我深表歉意。

感谢大家的帮助! :