【问题标题】:Creating an ArrayList of Arrays with predetermined length创建具有预定长度的数组的 ArrayList
【发布时间】:2015-11-01 22:10:21
【问题描述】:

本质上,我正在寻找创建笔记数组的 ArrayList:

   /**
   * Represents the entire musical score, with each index of the ArrayList representing each beat.
   * Each array of notes represent the notes that can play on a single beat (up to 120 notes, 12
   * notes over 10 octaves.
   */
  private List<Note[]> score;
  ...
  score = new ArrayList<>(8); // Initialize ArrayList with capacity of 8

我在这里遇到的第一个(次要)问题首先是 ArrayList 最终可能是任意大小并且可能必须增长很多倍(每次需要额外容量时都会增加一倍),第二个(更重要)问题是我无法将 ArrayList 中包含的数组的长度设置为 120,如下所示:

private List<Note[120]> score;

这让我想到了如何将 ArrayList 中可能存在或不存在的所有数组初始化为大小120,如果不可能,在这种情况下是否有可能使用更好的数据结构。谢谢!

【问题讨论】:

  • new ArrayList&lt;&gt;(8) 将初始容量设置为 8,not 将大小设置为 8。
  • @Makoto - 注意,在我的评论中没有明确区别
  • "如果那是不可能的 (...)" - 这可能是可能的,尽管我也不确定。 --- “在这种情况下是否有可能使用更好的数据类型” - 基于块的方法可能更适合这种情况;如果可能,您应该以更小的块处理,而不是分配所有这些空间。
  • 不可能只初始化意图。为了能够将列表元素初始化为任何长度,您需要在某处创建它们的代码。在这里您也可以将长度固定为 120。您似乎想要的是列表元素的默认值。

标签: java arrays list arraylist


【解决方案1】:

长度为120 的数组没有数据类型,因此不能有List&lt;Note[120]&gt;List&lt;Note[]&gt; 保证每个数组的长度为120。你可以做的是创建自己的类:

public final class TenOctaves {

    private static final int NUMBER_OF_NOTES = 120;

    private final Note[] notes = new Note[NUMBER_OF_NOTES];

    public void setNote(int position, Note note) {
         if (position < 0 || position >= NUMBER_OF_NOTES)
             throw new IllegalArgumentException();
         notes[position] = note;
    }

    public Note getNote(int position) {
        if (position < 0 || position >= NUMBER_OF_NOTES)
             throw new IllegalArgumentException();
        return notes[position];
    }
}

那么你可以改用List&lt;TenOctaves&gt;

【讨论】:

  • 我非常喜欢这种方法——我会尝试一下,看看能不能想出点什么。与我最初的方法相比,它在维护 SOLID 原则方面做得更好。
【解决方案2】:

如果我对您的理解正确,您可以继承 ArrayList 并实现您自己的特殊 add 逻辑。

public class NoteList extends ArrayList<Note[]> {

    private final int SCORE_LENGTH = 120;
    private final int MAX_ELEMENTS = 8;

    @Override
    public boolean add(Note[] score) {
        return this.size() <= MAX_ELEMENTS && score.length == SCORE_LENGTH && super.add(score);
    }
}

如果出现以下情况,您将无法向列表中添加元素:

  • 列表大小大于8
  • 要添加的数组长度不是 120

【讨论】:

  • 我也喜欢这种方法,但我选择使用 getNote() 和 setNote() 方法制作自己的类来表示单个 Beat,以更适当地扩展功能。感谢您的输入
猜你喜欢
  • 1970-01-01
  • 2013-08-27
  • 2019-04-07
  • 2019-09-29
  • 2013-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-19
相关资源
最近更新 更多