Πώς να προσθέσετε νέα στοιχεία σε έναν πίνακα;

Έχω τον ακόλουθο κώδικα:

String[] where;
where.append(ContactsContract.Contacts.HAS_PHONE_NUMBER + "=1");
where.append(ContactsContract.Contacts.IN_VISIBLE_GROUP + "=1");

Αυτές οι δύο προσθήκες δεν μεταγλωττίζονται. Πώς θα μπορούσε να λειτουργήσει σωστά;

Λύση

Το μέγεθος ενός πίνακα δεν μπορεί να τροποποιηθεί. Αν θέλετε έναν μεγαλύτερο πίνακα πρέπει να δημιουργήσετε έναν νέο.

Μια καλύτερη λύση θα ήταν να χρησιμοποιήσετε μια ArrayList η οποία μπορεί να μεγαλώνει όσο την χρειάζεστε. Η μέθοδος ArrayList.toArray( T[] a ) σας δίνει πίσω τον πίνακα σας αν τον χρειάζεστε σε αυτή τη μορφή.

List where = new ArrayList();
where.add( ContactsContract.Contacts.HAS_PHONE_NUMBER+"=1" );
where.add( ContactsContract.Contacts.IN_VISIBLE_GROUP+"=1" );

Αν πρέπει να το μετατρέψετε σε έναν απλό πίνακα...

String[] simpleArray = new String[ where.size() ];
where.toArray( simpleArray );

Αλλά τα περισσότερα πράγματα που μπορείτε να κάνετε με έναν πίνακα μπορείτε να τα κάνετε και με αυτή την ArrayList:

// iterate over the array
for( String oneItem : where ) {
    ...
}

// get specific items
where.get( 1 );
Σχόλια (3)

Χρησιμοποιήστε μια List, όπως μια ArrayList. Είναι δυναμικά αναπτυσσόμενη, σε αντίθεση με τους πίνακες (βλέπε: Effective Java 2nd Edition, Item 25: Prefer lists to arrays).

import java.util.*;
//....

List list = new ArrayList();
list.add("1");
list.add("2");
list.add("3");
System.out.println(list); // prints "[1, 2, 3]"

Αν επιμένετε να χρησιμοποιείτε πίνακες, μπορείτε να χρησιμοποιήσετε το java.util.Arrays.copyOf για να διαθέσετε έναν μεγαλύτερο πίνακα για να φιλοξενήσει το πρόσθετο στοιχείο. Αυτό όμως δεν είναι πραγματικά η καλύτερη λύση.

static  T[] append(T[] arr, T element) {
    final int N = arr.length;
    arr = Arrays.copyOf(arr, N + 1);
    arr[N] = element;
    return arr;
}

String[] arr = { "1", "2", "3" };
System.out.println(Arrays.toString(arr)); // prints "[1, 2, 3]"
arr = append(arr, "4");
System.out.println(Arrays.toString(arr)); // prints "[1, 2, 3, 4]"

Αυτό είναι O(N) ανά append. Η ArrayList, από την άλλη πλευρά, έχει O(1) αποσβεσμένο κόστος ανά πράξη.

Δείτε επίσης

  • Java Tutorials/Arrays
    • Ένας πίνακας είναι ένα αντικείμενο-περιέκτης που περιέχει έναν σταθερό αριθμό τιμών ενός και μόνο τύπου. Το μήκος ενός πίνακα καθορίζεται κατά τη δημιουργία του πίνακα. Μετά τη δημιουργία, το μήκος του είναι σταθερό.
  • Java Tutorials/The List interface
Σχόλια (1)

Όπως είπε ο tangens, το μέγεθος ενός πίνακα είναι σταθερό. Αλλά πρέπει πρώτα να τον ενσαρκώσετε, αλλιώς θα είναι μόνο μια μηδενική αναφορά.

String[] where = new String[10];

Αυτός ο πίνακας μπορεί να περιέχει μόνο 10 στοιχεία. Έτσι, μπορείτε να προσαρτήσετε μια τιμή μόνο 10 φορές. Στον κώδικά σας έχετε πρόσβαση σε μια μηδενική αναφορά. Αυτός είναι ο λόγος για τον οποίο δεν λειτουργεί. Για να έχετε μια δυναμικά αυξανόμενη συλλογή, χρησιμοποιήστε την ArrayList.

Σχόλια (0)