I denna handledning lär du dig om olika sätt du kan använda för att kopiera matriser (både endimensionella och tvådimensionella) i Java med hjälp av exempel.
I Java kan vi kopiera en array till en annan. Det finns flera tekniker du kan använda för att kopiera matriser i Java.
1. Kopiera arrays med tilldelningsoperatören
Låt oss ta ett exempel,
class Main ( 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 + ", "); ) ) )
Utgång :
1, 2, 3, 4, 5, 6
I exemplet ovan har vi använt uppdragsoperatören ( =
) för att kopiera en matris med namnen till en annan matris med namnet positiveNumbers.
Denna teknik är den enklaste och den fungerar också. Det finns dock ett problem med denna teknik. Om vi ändrar element i en matris ändras också motsvarande element i de andra grupperna. Till exempel,
class Main ( public static void main(String() args) ( int () numbers = (1, 2, 3, 4, 5, 6); int () positiveNumbers = numbers; // copying arrays // change value of first array numbers(0) = -1; // printing the second array for (int number: positiveNumbers) ( System.out.print(number + ", "); ) ) )
Utgång :
-1, 2, 3, 4, 5, 6
Här kan vi se att vi har ändrat ett värde i talmatrisen. När vi skriver ut positiveNumbers-arrayen kan vi se att samma värde också ändras.
Det beror på att båda matriserna hänvisar till samma arrayobjekt. Detta beror på den grunda kopian. För att lära dig mer om grunt exemplar, besök grunt exemplar.
Nu, för att skapa nya matrisobjekt medan du kopierar matriserna, behöver vi djup kopia snarare än en grunt kopia.
2. Använd Looping Construct för att kopiera arrays
Låt oss ta ett exempel:
import java.util.Arrays; class Main ( public static void main(String() args) ( int () source = (1, 2, 3, 4, 5, 6); int () destination = new int(6); // iterate and copy elements from source to destination for (int i = 0; i < source.length; ++i) ( destination(i) = source(i); ) // converting array to string System.out.println(Arrays.toString(destination)); ) )
Utgång :
(1, 2, 3, 4, 5, 6)
I exemplet ovan har vi använt for
slingan för att itera igenom varje element i källmatrisen. I varje iteration kopierar vi element från källmatrisen till destinationsmatrisen.
Här hänvisar käll- och destinationsmatrisen till olika objekt (djup kopia). Följaktligen, om element i en array ändras, är motsvarande element i en annan array oförändrade.
Lägg märke till uttalandet,
System.out.println(Arrays.toString(destination));
Här används metoden toString () för att konvertera en matris till en sträng. Om du vill veta mer besöker du metoden toString () (officiell Java-dokumentation).
3. Kopiera matriser med hjälp av arraycopy () -metoden
I Java innehåller systemklassen en metod som heter för arraycopy()
att kopiera matriser. Denna metod är ett bättre sätt att kopiera matriser än de två ovan.
Den arraycopy()
metod gör det möjligt att kopiera en viss del av källgruppen till destinationen array. Till exempel,
arraycopy(Object src, int srcPos,Object dest, int destPos, int length)
Här,
- src - källmatris som du vill kopiera
- srcPos - startposition (index) i källmatrisen
- dest - destination array där element kommer att kopieras från källan
- destPos - startposition (index) i destinationsmatrisen
- längd - antal element som ska kopieras
Låt oss ta ett exempel:
// To use Arrays.toString() method import java.util.Arrays; class Main ( 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 // 2 elements will be copied System.arraycopy(n1, 2, n3, 1, 2); System.out.println("n3 = " + Arrays.toString(n3)); ) )
Utgång :
n2 = (2, 3, 12, 4, 12, -2) n3 = (0, 12, 4, 0, 0)
I exemplet ovan har vi använt arraycopy()
metoden,
System.arraycopy(n1, 0, n2, 0, n1.length)
- hela element från n1-arrayen kopieras till n2-arrayenSystem.arraycopy(n1, 2, n3, 1, 2)
- 2 element i n1-arrayen som börjar från index 2 kopieras till indexet som börjar från 1 i n3-arrayen
Som du kan se är standardstartvärdet för element i en int-typmatris 0.
4. Kopiera matriser med copyOfRange () -metoden
Vi kan också använda metoden copyOfRange () som definieras i klassen Java Arrays för att kopiera matriser. Till exempel,
// 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)); ) )
Produktion
destination1 = (2, 3, 12, 4, 12, -2) destination2 = (12, 4, 12)
Lägg märke till raden i exemplet ovan,
int() destination1 = Arrays.copyOfRange(source, 0, source.length);
Här kan vi se att vi skapar destination1-matrisen och kopierar källmatrisen till den samtidigt. Vi skapar inte destination1-arrayen innan vi anropar copyOfRange()
metoden. För att lära dig mer om metoden, besök Java copyOfRange.
5. Kopiera 2d-matriser med Loop
På samma sätt som den endimensionella matrisen kan vi också kopiera den 2-dimensionella matrisen med hjälp av for
slingan. Till exempel,
import java.util.Arrays; class Main ( public static void main(String() args) ( int()() source = ( (1, 2, 3, 4), (5, 6), (0, 2, 42, -4, 5) ); 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)); ) )
Utgång :
((1, 2, 3, 4), (5, 6), (0, 2, 42, -4, 5))
Lägg märke till raden i programmet ovan,
System.out.println(Arrays.deepToString(destination);
Här används deepToString()
metoden för att ge en bättre representation av den tvådimensionella matrisen. För att lära dig mer, besök Java deepToString ().
Kopiera 2d-matriser med arraycopy ()
För att göra ovanstående kod enklare kan vi ersätta den inre slingan med System.arraycopy()
som i fallet med en endimensionell matris. Till exempel,
import java.util.Arrays; class Main ( public static void main(String() args) ( int()() source = ( (1, 2, 3, 4), (5, 6), (0, 2, 42, -4, 5) ); 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)); ) )
Utgång :
((1, 2, 3, 4), (5, 6), (0, 2, 42, -4, 5))
Här kan vi se att vi får samma utdata genom att ersätta den inre for
slingan med arraycopy()
metoden.