与数组和迭代有关的混乱

时间:2018-07-20 05:34:23

标签: java arrays 2d

我的主要方法中有一个局部变量ID,如下所示:

    ID = new int[9];
    ID[0] = 245;
    ID[1] = 76644;
    //etc

我还有一个objectArrayList,具有以下构造函数:

    public Songs( String songName, String artistName, Integer duration, double price) {

    this.songName = songName;
    this.artistName =artistName;
    this.duration = duration;
    this.price = price;

我启动了一个二维数组,如下所示:

   Songs reco[][];
    reco = new Songs [99999] [];         
    for (int i=0; i<99999; i++) {
        reco[i] = new Songs[20]; 
    }

我想做的是使用变量ID作为2d数组的第一个索引,如下所示:

    reco[ID[7]][1] = new Songs("Human", "The Killers", 288, 0.19); // ID always is a 5 digit number

为了使我可以使用[ID [x]]作为参考来浏览2d数组,以便添加可能遇到的持续时间的不同值。

假设以下2d数组:

     reco[ID[7]][0] = new Songs("Better Now", "Post Malone", 239, 0.25);
    reco[ID[7]][1] = new Songs("Human", "The Killers", 288, 0.19);
    reco[ID[0]][2] = new Songs("Smells like teen spirit", "Nirvana", 214, 0.28);

预期结果应为:

     "Customer:" [ID[7] total song duration is 239+288
     "Customer:" [ID[0]] total song duration is 214

问题是,无论我设法制造什么循环,最终我都会遇到空指针错误,因为我正在将[ID [x]] [v]与[ID [x] [v + 1]比较, ()方法,最终达到空值。

希望我的问题很清楚。

最好的

(我知道人们可以使用哈希函数使数字迭代的重要性降低,尽管这不是我现在想解决的问题)

1 个答案:

答案 0 :(得分:0)

空指针异常是由默认情况下访问填充有空元素的数组引起的。您正在使用类似

的元素
  

reco [ID [7]] [1] = ...

不检查ID数组中的索引7是元素还是null。

如果您要创建一个像新的Songs[99999]这样的非常长的数组,则应使用一个List和Iterators,以便该真正长数组的内存中没有保留空间。 “ 99999首歌曲”

Songs reco[][];
    reco = new Songs [99999] [];         
    for (int i=0; i<99999; i++) {
        reco[i] = new Songs[20]; 
    }

创建ArrayList或List并用诸如以下歌曲列表填充它要容易得多:

List<List<Songs>> songs = new ArrayList<ArrayList<Songs>>();

然后您可以遍历整个列表,例如:

for(List<Songs> tempSongsArray : songs)
{
   for(Songs tempSong : tempSongsArray)
   {
      //Code using tempSong as Songs Element
   }
} 

由于列表的长度<==>列表中的元素的长度,因此使用列表应该是空指针安全的