در این آموزش با روش های مختلفی که می توانید از آن ها برای کپی کردن آرایه ها (هم یک بعدی و هم دو بعدی) در جاوا استفاده کنید، آشنا می شوید.
چندین تکنیک وجود دارد که می توانید برای کپی کردن آرایه ها در جاوا استفاده کنید.
۱- کپی کردن آرایه ها با استفاده از عملگر انتساب
بیایید مثالی بزنیم ،
class CopyArray {
public static void main(String[] args) {
int [] numbers = {1, 2, 3, 4, 5, 6};
int [] positiveNumbers = numbers; // copying arrays
for (int number: positiveNumbers) {
System.out.print(number + “, “);
}
}
}
خروجی
۱, ۲, ۳, ۴, ۵, ۶
اگرچه به نظر می رسد این روش برای کپی کردن آرایه ها کاملا کارآمد است ، اما مشکلی در این مورد وجود دارد.
اگر عناصر یک آرایه را در مثال بالا تغییر دهید ، عناصر مربوط به آرایه دیگر نیز تغییر می کند.
class AssignmentOperator {
public static void main(String[] args) {
int [] numbers = {1, 2, 3, 4, 5, 6};
int [] positiveNumbers = numbers; // copying arrays
numbers[0] = -1;
for (int number: positiveNumbers) {
System.out.print(number + “, “);
}
}
}
خروجی
-۱, ۲, ۳, ۴, ۵, ۶
هنگامی که اولین عنصر آرایه numbers به -۱ تغییر می کند، اولین عنصر آرایه positiveNumbers نیز به -۱ تبدیل می شود. به این دلیل که هر دو آرایه به یک شیء آرایه یکسان اشاره دارند.
به این کار کپی سطحی گفته می شود.
با این حال ، بیشتر اوقات ، به جای کپی سطحی ، به کپی عمیق نیاز داریم. یک کپی عمیق مقادیر ایجاد شی آرایه جدید را کپی می کند.
۲- استفاده از ساختار حلقه برای کپی کردن آرایه ها
بیایید یک مثال بزنیم:
import java.util.Arrays;
class ArraysCopy {
public static void main(String[] args) {
int [] source = {1, 2, 3, 4, 5, 6};
int [] destination = new int[6];
for (int i = 0; i < source.length; ++i) {
destination[i] = source[i];
}
// converting array to string
System.out.println(Arrays.toString(destination));
}
}
خروجی
[۱, ۲, ۳, ۴, ۵, ۶]
در اینجا ، از حلقه برای کپی عناصر آرایه منبع استفاده می شود. در هر تکرار ، عنصر متناظر از آرایه منبع در آرایه مقصد کپی می شود.
آرایه منبع و مقصد مرجع یکسان ندارند (کپی عمیق). به این معنی که اگر عناصر یک آرایه (یا منبع یا مقصد) تغییر یابد ، عناصر مربوط به آرایه دیگر تغییر نمی کند.
از متد ()toString برای تبدیل آرایه به رشته (فقط برای خروجی) استفاده می شود.
روش بهتری (بهتر از حلقه ها) برای کپی کردن آرایه ها در جاوا با استفاده از ()arraycopy و ()copyOfRange وجود دارد.
۳- کپی کردن آرایه ها با ()arraycopy
کلاس System شامل متد ()arraycopy است که به شما امکان می دهد داده ها را از یک آرایه به دیگری کپی کنید.
روش ()arraycopy کارآمد و انعطاف پذیر است. این روش به شما امکان می دهد بخش مشخصی از آرایه منبع را به آرایه مقصد کپی کنید.
public static void arraycopy(Object src, int srcPos,
Object dest, int destPos, int length)
در اینجا،
- src – آرایه ای که می خواهید کپی کنید
- srcPos – موقعیت شروع (شاخص) در آرایه src
- dest – عناصر آرایه src در این آرایه کپی می شوند
- destPos – موقعیت شروع (شاخص) در آرایه مقصد
- length – تعداد عناصر برای کپی کردن
بیایید یک مثال بزنیم:
// To use Arrays.toString() method
import java.util.Arrays;
class ArraysCopy {
public static void main(String[] args) {
int[] n1 = {2, 3, 12, 4, 12, -2};
int[] n3 = new int[5];
// Creating n2 array of having length of n1 array
int[] n2 = new int[n1.length];
// copying entire n1 array to n2
System.arraycopy(n1, 0, n2, 0, n1.length);
System.out.println(“n2 = ” + Arrays.toString(n2));
// copying elements from index 2 on n1 array
// copying element to index 1 of n3 array
// ۲ elements will be copied
System.arraycopy(n1, 2, n3, 1, 2);
System.out.println(“n3 = ” + Arrays.toString(n3));
}
}
خروجی
n2 = [2, 3, 12, 4, 12, -2]
n3 = [0, 12, 4, 0, 0]
توجه داشته باشید ، مقدار اولیه پیش فرض عناصر یک آرایه از نوع عدد صحیح ۰ است.
۴- کپی کردن آرایه ها با روش ()copyOfRange
علاوه بر این ، می توانید از روش ()copyOfRange تعریف شده در کلاس java.util.Arrays برای کپی کردن آرایه ها استفاده کنید. احتیاجی نیست قبل استفاده از این روش آرایه مقصد را ایجاد کنید.
در این جا نحوه انجام این کار آورده شده است.
// To use toString() and copyOfRange() method
import java.util.Arrays;
class ArraysCopy {
public static void main(String[] args) {
int[] source = {2, 3, 12, 4, 12, -2};
// copying entire source array to destination
int[] destination1 = Arrays.copyOfRange(source, 0, source.length);
System.out.println(“destination1 = ” + Arrays.toString(destination1));
// copying from index 2 to 5 (5 is not included)
int[] destination2 = Arrays.copyOfRange(source, 2, 5);
System.out.println(“destination2 = ” + Arrays.toString(destination2));
}
}
خروجی
destination1 = [2, 3, 12, 4, 12, -2]
destination2 = [12, 4, 12]
۵- کپی کردن آرایه های دو بعدی با استفاده از حلقه
مثالی برای کپی کردن آرایه های دو بعدی نامنظم با استفاده از حلقه وجود دارد:
import java.util.Arrays;
class ArraysCopy {
public static void main(String[] args) {
int[][] source = {
{۱, ۲, ۳, ۴},
{۵, ۶},
{۰, ۲, ۴۲, -۴, ۵}
};
int[][] destination = new int[source.length][];
for (int i = 0; i < destination.length; ++i) {
// allocating space for each row of destination array
destination[i] = new int[source[i].length];
for (int j = 0; j < destination[i].length; ++j) {
destination[i][j] = source[i][j];
}
}
// displaying destination array
System.out.println(Arrays.deepToString(destination));
}
}
خروجی
[[۱, ۲, ۳, ۴], [۵, ۶], [۰, ۲, ۴۲, -۴, ۵]]
در کد بالا از روش() Arrays.deepToString استفاده کردیم. ()deepToString نمایش بهتری از یک آرایه چند بعدی را مانند یک آرایه ۲ بعدی فراهم می کند.
می توانید حلقه داخلی کد فوق را با ()System.arraycopy یا()Arrays.copyOf مانند آرایه یک بعدی جایگزین کنید.
در اینجا مثالی برای انجام همان کار با روش ()arraycopy آورده شده است.
import java.util.Arrays;
class AssignmentOperator {
public static void main(String[] args) {
int[][] source = {
{۱, ۲, ۳, ۴},
{۵, ۶},
{۰, ۲, ۴۲, -۴, ۵}
};
int[][] destination = new int[source.length][];
for (int i = 0; i < source.length; ++i) {
// allocating space for each row of destination array
destination[i] = new int[source[i].length];
System.arraycopy(source[i], 0, destination[i], 0, destination[i].length);
}
// displaying destination array
System.out.println(Arrays.deepToString(destination));
}
}