جافا: مجموعة ثنائية الأبعاد مع أساليب/قدرات مماثلة لـ ArrayList
-
23-09-2019 - |
سؤال
أرغب في إنشاء مجموعة 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.