Σε αυτό το σεμινάριο, θα μάθετε για διαφορετικούς τρόπους που μπορείτε να χρησιμοποιήσετε για να αντιγράψετε συστοιχίες (τόσο μονοδιάστατες όσο και δισδιάστατες) στην Java με τη βοήθεια παραδειγμάτων.
Στην Java, μπορούμε να αντιγράψουμε έναν πίνακα σε έναν άλλο. Υπάρχουν πολλές τεχνικές που μπορείτε να χρησιμοποιήσετε για να αντιγράψετε πίνακες στην Java.
1. Αντιγραφή συστοιχιών με χρήση του χειριστή ανάθεσης
Ας πάρουμε ένα παράδειγμα,
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 + ", "); ) ) )
Έξοδος :
1, 2, 3, 4, 5, 6
Στο παραπάνω παράδειγμα, χρησιμοποιήσαμε τον τελεστή ανάθεσης ( =
) για να αντιγράψουμε έναν πίνακα που ονομάζεται αριθμούς σε έναν άλλο πίνακα που ονομάζεται positiveNumbers.
Αυτή η τεχνική είναι η ευκολότερη και λειτουργεί επίσης. Ωστόσο, υπάρχει πρόβλημα με αυτήν την τεχνική. Εάν αλλάξουμε στοιχεία ενός πίνακα, αλλάζουν και τα αντίστοιχα στοιχεία των άλλων συστοιχιών. Για παράδειγμα,
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 + ", "); ) ) )
Έξοδος :
-1, 2, 3, 4, 5, 6
Εδώ, μπορούμε να δούμε ότι έχουμε αλλάξει μία τιμή του πίνακα αριθμών. Όταν εκτυπώνουμε τον πίνακα θετικών αριθμών, μπορούμε να δούμε ότι αλλάζει και η ίδια τιμή.
Είναι επειδή και οι δύο πίνακες αναφέρονται στο ίδιο αντικείμενο πίνακα. Αυτό οφείλεται στο ρηχό αντίγραφο. Για να μάθετε περισσότερα σχετικά με το ρηχό αντίγραφο, επισκεφθείτε το ρηχό αντίγραφο.
Τώρα, για να δημιουργήσουμε νέα αντικείμενα συστοιχίας κατά την αντιγραφή των πινάκων, χρειαζόμαστε βαθιά αντιγραφή και όχι ρηχό αντίγραφο.
2. Χρησιμοποιώντας Looping Construct για αντιγραφή συστοιχιών
Ας πάρουμε ένα παράδειγμα:
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)); ) )
Έξοδος :
(1, 2, 3, 4, 5, 6)
Στο παραπάνω παράδειγμα, χρησιμοποιήσαμε τον for
βρόχο για να επαναλάβουμε κάθε στοιχείο του πίνακα προέλευσης. Σε κάθε επανάληψη, αντιγράφουμε στοιχεία από τον πίνακα προέλευσης στον πίνακα προορισμού.
Εδώ, ο πίνακας προέλευσης και προορισμού αναφέρεται σε διαφορετικά αντικείμενα (σε βάθος αντίγραφο). Επομένως, εάν αλλάξουν στοιχεία ενός πίνακα, τα αντίστοιχα στοιχεία ενός άλλου πίνακα δεν αλλάζουν.
Παρατηρήστε τη δήλωση,
System.out.println(Arrays.toString(destination));
Εδώ, η μέθοδος toString () χρησιμοποιείται για τη μετατροπή ενός πίνακα σε συμβολοσειρά. Για να μάθετε περισσότερα, επισκεφθείτε τη μέθοδο toString () (επίσημη τεκμηρίωση Java).
3. Αντιγραφή συστοιχιών χρησιμοποιώντας τη μέθοδο arraycopy ()
Στην Java, η κλάση συστήματος περιέχει μια μέθοδο που ονομάζεται arraycopy()
για αντιγραφή συστοιχιών. Αυτή η μέθοδος είναι μια καλύτερη προσέγγιση για την αντιγραφή συστοιχιών από τα δύο παραπάνω.
Η arraycopy()
μέθοδος σάς επιτρέπει να αντιγράψετε ένα καθορισμένο τμήμα του πίνακα προέλευσης στον πίνακα προορισμού. Για παράδειγμα,
arraycopy(Object src, int srcPos,Object dest, int destPos, int length)
Εδώ,
- src - πίνακας προέλευσης που θέλετε να αντιγράψετε
- srcPos - αρχική θέση (ευρετήριο) στον πίνακα προέλευσης
- προορισμός - πίνακας προορισμού όπου τα στοιχεία θα αντιγραφούν από την πηγή
- destPos - αρχική θέση (ευρετήριο) στη σειρά προορισμού
- μήκος - αριθμός στοιχείων προς αντιγραφή
Ας πάρουμε ένα παράδειγμα:
// 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)); ) )
Έξοδος :
n2 = (2, 3, 12, 4, 12, -2) n3 = (0, 12, 4, 0, 0)
Στο παραπάνω παράδειγμα, χρησιμοποιήσαμε τη arraycopy()
μέθοδο,
System.arraycopy(n1, 0, n2, 0, n1.length)
- ολόκληρα τα στοιχεία από τον πίνακα n1 αντιγράφονται στον πίνακα n2System.arraycopy(n1, 2, n3, 1, 2)
- 2 στοιχεία του πίνακα n1 ξεκινώντας από το ευρετήριο 2 αντιγράφονται στο ευρετήριο ξεκινώντας από 1 του πίνακα n3
Όπως μπορείτε να δείτε, η προεπιλεγμένη αρχική τιμή των στοιχείων ενός πίνακα τύπου int είναι 0.
4. Αντιγραφή συστοιχιών με τη μέθοδο copyOfRange ()
Μπορούμε επίσης να χρησιμοποιήσουμε τη μέθοδο copyOfRange () που ορίζεται στην κλάση Java 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)
Στο παραπάνω παράδειγμα, παρατηρήστε τη γραμμή,
int() destination1 = Arrays.copyOfRange(source, 0, source.length);
Εδώ, μπορούμε να δούμε ότι δημιουργούμε τον πίνακα προορισμού1 και αντιγράφουμε τον πίνακα προέλευσης σε αυτόν ταυτόχρονα. Δεν δημιουργούμε τον πίνακα destination1 πριν καλέσουμε τη copyOfRange()
μέθοδο. Για να μάθετε περισσότερα σχετικά με τη μέθοδο, επισκεφθείτε το Java copyOfRange.
5. Αντιγραφή 2d συστοιχιών χρησιμοποιώντας βρόχο
Παρόμοια με τη μονοδιάστατη συστοιχία, μπορούμε επίσης να αντιγράψουμε τη δισδιάστατη συστοιχία χρησιμοποιώντας το for
βρόχο. Για παράδειγμα,
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)); ) )
Έξοδος :
((1, 2, 3, 4), (5, 6), (0, 2, 42, -4, 5))
Στο παραπάνω πρόγραμμα, παρατηρήστε τη γραμμή,
System.out.println(Arrays.deepToString(destination);
Εδώ, η deepToString()
μέθοδος χρησιμοποιείται για να παρέχει μια καλύτερη αναπαράσταση του δισδιάστατου πίνακα. Για να μάθετε περισσότερα, επισκεφθείτε το Java deepToString ().
Αντιγραφή 2d συστοιχιών με χρήση arraycopy ()
Για να κάνουμε τον παραπάνω κώδικα πιο απλό, μπορούμε να αντικαταστήσουμε τον εσωτερικό βρόχο με System.arraycopy()
όπως στην περίπτωση ενός μονοδιάστατου πίνακα. Για παράδειγμα,
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)); ) )
Έξοδος :
((1, 2, 3, 4), (5, 6), (0, 2, 42, -4, 5))
Εδώ, μπορούμε να δούμε ότι έχουμε την ίδια έξοδο αντικαθιστώντας τον εσωτερικό for
βρόχο με τη arraycopy()
μέθοδο.