【问题标题】:ArrayList of ArrayList in JavaJava中ArrayList的ArrayList
【发布时间】:2012-01-12 01:08:54
【问题描述】:

我是 Java 新手,具有 C/C++ 背景。我正在尝试为 Android 编写音乐播放器应用程序,并且正在开发库扫描功能。我想要一个格式为艺术家->专辑->歌曲的分层数据库,其中艺术家有一个名字和一组专辑,一个专辑有一个名字、年份和一组歌曲,而歌曲有一个标题、曲目编号和文件位置。

我创建了三个类来存储这些信息:

public class libraryElementArtist
{
    public String name;
    public ArrayList<libraryElementAlbum> albums;
}

public class libraryElementAlbum
{
    public String name;
    public String year;
    public ArrayList<libraryElementSong> songs;
}

public class libraryElementSong
{
    public String name;
    public int num;
    public String filename;
}

填充它们的想法很简单 - 扫描每个文件并首先添加其艺术家,然后是专辑,然后是歌曲。每次在创建新专辑之前,它都会检查以确保艺术家/专辑不存在。

基本上,我开始创建一个 ArrayList 来存储艺术家信息,如下所示:

 ArrayList<libraryElementArtist> libraryData = new ArrayList<libraryElementArtist>();

然后,将艺术家添加到数据库:

libraryElementArtist newEntry = new libraryElementArtist();
newEntry.name = song_artist;
libraryData.add(newEntry);

然后添加相册:

libraryElementAlbum newEntry = new libraryElementAlbum();
newEntry.name = song_album;
libraryData.get(artistIndex).albums.add(newEntry);

artistIndex 是专辑艺术家在顶级艺术家数组中的索引。

当我在设备上运行它并在调试器中单步执行时,libraryElementArtist 项目被插入到 libraryData 数组中,并且它们的名称被正确填写。但是,专辑字段被列为 null 并尝试添加专辑确实不填写任何数据。

对不起,如果这是一个菜鸟问题,就像我说我是 Java 新手,我已经搜索过但找不到我要找的东西。另外,这是我在 C++ 中执行此类任务的方式,不确定它是否是正确的 Java 方式。

【问题讨论】:

  • 相反,您应该创建用户定义对象的 ArrayList。类似ArrayList&lt;Songs&gt;
  • 我在添加艺术家部分添加了一行:newEntry.albums = new ArrayList&lt;libraryElementAlbum&gt;(); 这使得 Object[0] 元素的数组显示在专辑下,但该元素仍然没有填充。
  • 修复了它,这是一个关于 ArtistIndex 变量的愚蠢错误。正在创建艺术家,然后当专辑代码尝试运行时,它试图写入不存在的艺术家并失败。对于将来看到此线程的任何人,当所有索引都正确时,上面的代码可以正常工作。
  • 将来,无论您在哪里使用一些整数“魔术索引”,都可以考虑使用 Map 代替,以 Artist 作为键。

标签: java android class arraylist


【解决方案1】:

所有的构造函数都应该创建(不仅仅是声明)ArrayLists。否则它们将为空。您可以以较小的尺寸启动它们以节省空间。例如

songs = new ArrayList(3);

【讨论】:

  • 我在艺术家创作中添加了一行来执行此操作,但它只是初始化了一个空的 ArrayList(new ArrayList() )问题是完全不同的,但我得到了它的工作。
【解决方案2】:

使用 getter 和 setter 创建一个自定义类,然后创建一个数组列表作为该数据类型(您的自定义类)

List<customClass> foo = ArrayList<customClass>

与上面的评论相同,但更多信息

【讨论】:

  • 这是如何分层的?这只是将有关每首歌曲的所有信息(曲目、艺术家、专辑、名称、文件路径、年份)存储在单个对象中,并将大量信息存储到数组中。这并不容易导航并且会占用更多的 RAM(因为每首歌曲都存储了艺术家姓名、专辑名称等的副本)。我希望它使用尽可能少的资源,因为它在 Android 而不是 PC 上运行。另一种选择是某种树数据结构,这是我尝试使用标准数组创建的,因为树的结构是固定的。
【解决方案3】:

我认为是一个继承基础,所​​以让你的类层次结构一样(使用继承),所以你只需要创建一个类,它具有其父级的所有派生属性类,并只制作该类的ArrayList,因此您不必制作嵌套的ArrayList。 (如果我没有错,或者如果那么请解释)。 :-)

或者通常只制作一个具有所有属性的类,如上所述,并为此使用一些 getter、setter 方法,并使用该类制作您的 ArrayList。

【讨论】:

  • +1 同意这一点。是的,您知道为什么我建议使用 ArrayList 类型的数组列表,因为您只需要管理获取/设置对象,否则在其他 ArrayList> 情况下,您必须管理单独的值。
  • @Paresh Mayani - 这就是我建议只做一堂课的原因。
  • is-a 原则呢?艺术家不是专辑,专辑不是歌曲,歌曲不是专辑,专辑不是文章。正确的?那我们这里怎么应用继承呢?
  • 如果你只有一个ArrayList,这如何保持层次结构?也许这个类继承自一个主类,但是索引艺术家->专辑->歌曲的能力被破坏了。在列表中包含列表的全部意义在于,可以选择一位艺术家并显示该艺术家的所有专辑,而无需对数组进行详尽的搜索(或对其进行多次搜索,构建额外的临时结构来存储搜索到的信息)。理想情况下,这种结构中的数据可以轻松转储到 XML 或类似 XML 的文件中(因为扫描库需要一段时间,所以缓存)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-28
  • 2013-12-26
  • 1970-01-01
  • 1970-01-01
  • 2012-05-27
  • 1970-01-01
相关资源
最近更新 更多