جافا: مجموعة ثنائية الأبعاد مع أساليب/قدرات مماثلة لـ ArrayList

StackOverflow https://stackoverflow.com/questions/2542250

سؤال

أرغب في إنشاء مجموعة XY من الأعداد الصحيحة (أو أي نوع) ، لكنني أريد استخدام طرق مثل "Add" ، "إزالة" ، "تحتوي على" ، "indexof" على غرار فئة ArrayList.

هل هناك فئة موجودة مع هذه القدرات؟

ملاحظة: لا أريد إنشاء قائمة ArrayList of ArrayList

هل كانت مفيدة؟

المحلول

لا ، AFAIK لا يوجد أي فصل مثل هذا. ولكن يجب أن يكون تنفيذ المرء سهلاً إلى حد ما:

class BiDimensionalArray<T>{
  Object[][] backupArray;
  int lengthX;
  int lengthY;

  public BiDimensionalArray(int lengthX, int lengthY) {
    backupArray = new Object[lengthX][lengthY];
    this.lengthX = lengthX;
    this.lengthY = lengthY;
  }

  public void set(int x, int y, T value){
    backupArray[x][y] = value;
  }

  public T get(int x, int y){
    return (T) backupArray[x][y];
  }

  public void addX(T[] valuesY) {
    Object[][] newArray = new Object[lengthX+1][lengthY];
    System.arraycopy(backupArray, 0, newArray, 0, lengthX);
    newArray[lengthX]=valuesY;
    backupArray = newArray;
    lengthX = lengthX+1;
  }
}

ملاحظة: لا يتم استخدام TypeParameter داخليًا ، لأنه لا يوجد شيء مثل new T[][]

تعديلات
تمت إضافة طريقة ADDX للظهور
خطوات الترجمة الثابتة

نصائح أخرى

من وصفك ، أود أن أقترح عليك محاولة استخدام JAMA.
يمكنك أيضًا إنشاء تطبيقك الخاص لمصفوفة XY. ومع ذلك ، للقيام بذلك ، سيكون عليك أن تقرر بالضبط ما تريده من التنفيذ.
إذا لم تكن المصفوفة بحجم ثابت ، فيمكنك استخدام شيء مثل تنسيق 3-Tuple لتخزين المصفوفات. (هذا التمثيل فعال فقط إذا كانت المصفوفة الخاصة بك متفرقًا). داخليا ، سوف تستخدم ثلاثة طريقين. واحد لتخزين رقم الصف ، والثاني لتخزين رقم العمود والثالث لتخزين القيمة الفعلية.
وفقا لذلك ، سوف تكتب add(int row, int column, int value) الطريقة ، التي تهتم بأشياء مثل الحفاظ على ترتيب الطائرات حسب رقم الصف ، ثم حسب رقم العمود ، وما إلى ذلك لزيادة كفاءة الوصول العشوائي.
مع هذا التمثيل ، يمكنك تنفيذ جميع الأساليب مثل remove(), contains(), ، وهي متاحة لـ ArrayList.

لا توجد أنواع المصفوفة الأصلية في مكتبات Java القياسية. ومع ذلك ، من السهل إلى حد ما إنشاء واحدة. الأساليب تافهة للتنفيذ ويمكنك دعمها باستخدام صفيف ، أ List أو أيا كان.

public class Matrix<T> {
  private final List<T> values;
  private final int rows;

  public Matrix(int x, int y) {
    this.rows = x;
    values = new ArrayList<T>(x * y);
  ]

  public int get(int x, int y) {
    return values.get(x * rows + y);
  }

  public boolean contains(T t) {
    return values.contains(t);
  }

  // etc
}

الدفع جامع, ، إنه من Mathworks و NIST.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top