ساختارهای داده: آرایه ها
آرایه استاتیک
آرایه یک ساختار داده خطی است که در آن همه عناصر به صورت متوالی مرتب شده اند. این مجموعه ای از عناصر است همان نوع داده ذخیره شده در حافظه پیوسته مکان ها
مقدار دهی اولیه
public class Array<T> {
private T[] self;
private int size;
@SuppressWarnings("unchecked")
public Array(int size) {
if (size <= 0) {
throw new IllegalArgumentException("Invalid array size (must be positive): " + size);
} else {
this.size = size;
this.self = (T[]) new Object[size];
}
}
}
در کلاس آرایه هسته، اندازه آرایه و یک اسکلت کلی برای مقداردهی اولیه آرایه را ذخیره می کنیم. در سازنده، اندازه آرایه را میخواهیم و یک شی میسازیم و آن را در آرایه مورد نظر خود ریخته میکنیم.
روش تنظیم
public void set(T item, int index) {
if (index >= this.size || index < 0) {
throw new IndexOutOfBoundsException("Index Out of bounds: " + index);
} else {
this.self[index] = item;
}
}
این روش درخواست می کند که یک آیتم در آرایه و فهرستی که آیتم باید در آن ذخیره شود ذخیره شود.
دریافت روش
public T get(int index) {
if (index >= this.size || index < 0) {
throw new IndexOutOfBoundsException("Index Out of bounds");
} else {
return self[index];
}
}
Get Method یک نمایه می خواهد و مورد را از آن فهرست بازیابی می کند.
روش چاپ
public void print() {
for (int i = 0; i < size; i++) {
System.out.println(this.self[i]+" ");
}
}
روش چاپ فقط چاپ تمام اعضای یک آرایه در یک خط با فاصله ای است که هر آیتم را بین آنها جدا می کند.
آرایه مرتب شده
آرایه ها اما دارای قابلیت مرتب سازی عناصر خود هستند.
مقدار دهی اولیه
public class SortedArray<T extends Comparable<T>> {
private T[] array;
private int size;
private final int maxSize;
@SuppressWarnings("unchecked")
public SortedArray(int maxSize) {
if (maxSize <= 0) {
throw new IllegalArgumentException("Invalid array max size (must be positive): " + maxSize);
}
this.array = (T[]) new Comparable[maxSize];
this.size = 0;
this.maxSize = maxSize;
}
}
در کلاس آرایه مرتب شده، میخواهیم اندازه آرایه را ذخیره کنیم و حداکثر اندازه آرایه را نیز و یک اسکلت کلی برای مقداردهی اولیه آرایه بخواهیم. در سازنده، Max Size آرایه را میخواهیم و یک شی میسازیم و آن را در آرایه مورد نظر خود ریخته میکنیم.
گیرندگان
public int length() {
return this.size;
}
public int maxLength() {
return this.maxSize;
}
public T get(int index) {
if (index < 0 || index >= this.size) {
throw new IndexOutOfBoundsException("Index out of
bounds: " + index);
}
return this.array[index];
}
روش درج
private int findInsertionPosition(T item) {
int left = 0;
int right = size - 1;
while (left <= right) {
int mid = (left + right) / 2;
int cmp = item.compareTo(this.array[mid]);
if (cmp < 0) {
right = mid - 1;
} else {
left = mid + 1;
}
}
return left;
}
public void insert(T item) {
if (this.size >= this.maxSize) {
throw new IllegalStateException("The array is already full");
}
int position = findInsertionPosition(item);
for (int i = size; i > position; i--) {
this.array[i] = this.array[i - 1];
}
this.array[position] = item;
size++;
}
Insert Method مورد را در موقعیت خود به شکل مرتب شده درج می کند.
روش حذف
public void delete(T item) {
int index = binarySearch(item);
if (index == -1) {
throw new IllegalArgumentException("Unable to delete element " + item + ": the entry is not in the array");
}
for (int i = index; i < size - 1; i++) {
this.array[i] = this.array[i + 1];
}
this.array[size - 1] = null;
size--;
}
روش های جستجو
private int binarySearch(T target) {
int left = 0;
int right = size - 1;
while (left <= right) {
int mid = (left + right) / 2;
int cmp = target.compareTo(this.array[mid]);
if (cmp == 0) {
return mid;
} else if (cmp < 0) {
right = mid - 1;
} else {
left = mid + 1;
}
}
return -1;
}
public Integer find(T target) {
int index = binarySearch(target);
return index == -1 ? null : index;
}
روش تراورس
public void traverse(Callback<T> callback) {
for (int i = 0; i < this.size; i++) {
callback.call(this.array[i]);
}
}
رابط پاسخ به تماس
public interface Callback<T> {
void call(T item);
}
استفاده از واسط برگشت به تماس در پیمایش
public class UppercaseCallback implements UnsortedArray.Callback<String> {
@Override
public void call(String item) {
System.out.println(item.toUpperCase());
}
}
آرایه مرتب نشده
از بالا تقریبا همینطوره
مقداردهی اولیه و دریافت کننده ها یکسان هستند.
روش درج
public void insert(T item) {
if (this.size >= this.maxSize) {
throw new IllegalStateException("The array is already full");
} else {
this.self[this.size] = item;
this.size++;
}
}
روش حذف نیز به همین صورت است
روش جستجو
public Integer find(T target) {
for (int i = 0; i < this.size; i++) {
if (this.self[i].equals(target)) {
return i;
}
}
return null;
}
آرایه پویا
Dynamic Array مانند لیست ها یا لیست های آرایه هستند.
مقدار دهی اولیه
public class DynamicArray<T> {
private T[] array;
private int size;
private int capacity;
@SuppressWarnings("unchecked")
public DynamicArray(int initialCapacity) {
if (initialCapacity <= 0) {
throw new IllegalArgumentException("Invalid initial capacity: " + initialCapacity);
}
this.capacity = initialCapacity;
this.array = (T[]) new Object[initialCapacity];
this.size = 0;
}
}
روش درج
private void resize(int newCapacity) {
@SuppressWarnings("unchecked")
T[] newArray = (T[]) new Object[newCapacity];
for (int i = 0; i < size; i++) {
newArray[i] = array[i];
}
array = newArray;
capacity = newCapacity;
}
public void insert(T item) {
if (size >= capacity) {
resize(2 * capacity);
}
array[size++] = item;
}
روش حذف
public void delete(T item) {
int index = find(item);
if (index == -1) {
throw new IllegalArgumentException("Item not found: " + item);
}
for (int i = index; i < size - 1; i++) {
array[i] = array[i + 1];
}
array[--size] = null;
if (capacity > 1 && size <= capacity / 4) {
resize(capacity / 2);
}
}
همه چیز دیگه همینطوره
امیدوارم این به کار با آرایه ها کمک کند. موفق باشید!