Wie füge ich einem Array neue Elemente hinzu?

291

Ich habe folgenden Code:

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

Diese beiden Anhänge werden nicht kompiliert. Wie würde das richtig funktionieren?

Pentium10
quelle

Antworten:

395

Die Größe eines Arrays kann nicht geändert werden. Wenn Sie ein größeres Array wünschen, müssen Sie ein neues instanziieren.

Eine bessere Lösung wäre die Verwendung eines, ArrayListdas nach Bedarf wachsen kann. Die Methode ArrayList.toArray( T[] a )gibt Ihnen Ihr Array zurück, wenn Sie es in dieser Form benötigen.

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

Wenn Sie es in ein einfaches Array konvertieren müssen ...

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

Aber die meisten Dinge, die Sie mit einem Array tun, können Sie auch mit dieser ArrayList tun:

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

// get specific items
where.get( 1 );
Tangens
quelle
9
Was bringt es, Array zu verwenden, wenn Sie dasselbe mit ArrayList tun können?
Skoua
@ tangens.Ich bin neu in Android, aber Ihre Antwort hat mir geholfen. Bevor ich eine Antwort fand, verschwendete ich viele Stunden
Scott
1
@ Skoua Arrays sind effizienter. Durch die Vordefinition der Objektgröße kann der Compiler den Speicher optimieren. Für einige Anwendungen ist es wichtig. Eine kleine App, die auf einem modernen Computer ausgeführt wird, kann wahrscheinlich mit vielen Listen davonkommen, bevor der Speicher zum Problem wird.
DraxDomax
102

Verwenden Sie ein List<String>, wie z ArrayList<String>. Im Gegensatz zu Arrays ist es dynamisch erweiterbar (siehe: Effektive Java 2nd Edition, Punkt 25: Listen Arrays vorziehen ).

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

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

Wenn Sie auf der Verwendung von Arrays bestehen, können Sie java.util.Arrays.copyOfein größeres Array zuweisen, um das zusätzliche Element aufzunehmen. Dies ist jedoch nicht die beste Lösung.

static <T> 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]"

Dies ist O(N)per append. ArrayListhat andererseits die O(1)Kosten pro Operation amortisiert.

Siehe auch

Polygenschmierstoffe
quelle
Sie können die Größe des Arrays jedes Mal verdoppeln, wenn die Kapazität nicht ausreicht. Auf diese Weise wird anhängen O (1) abgeschrieben. Wahrscheinlich was ArrayListintern macht.
Siyuan Ren
32

Apache Commons Lang hat

T[] t = ArrayUtils.add( initialArray, newitem );

Es wird ein neues Array zurückgegeben. Wenn Sie jedoch aus irgendeinem Grund wirklich mit Arrays arbeiten, ist dies möglicherweise der ideale Weg, dies zu tun.

Xenoterracid
quelle
23

Es gibt eine andere Option, die ich hier nicht gesehen habe und die keine "komplexen" Objekte oder Sammlungen beinhaltet.

String[] array1 = new String[]{"one", "two"};
String[] array2 = new String[]{"three"};
String[] array = new String[array1.length + array2.length];
System.arraycopy(array1, 0, array, 0, array1.length);
System.arraycopy(array2, 0, array, array1.length, array2.length);
ACLima
quelle
14

Es gibt keine Methode append() für Arrays. Stattdessen kann ein List-Objekt, wie bereits vorgeschlagen, die Notwendigkeit des dynamischen Einfügens von Elementen, z.

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

Oder wenn Sie wirklich ein Array verwenden möchten:

String[] where = new String[]{
    ContactsContract.Contacts.HAS_PHONE_NUMBER + "=1",
    ContactsContract.Contacts.IN_VISIBLE_GROUP + "=1"
};

Dies ist jedoch eine feste Größe, und es können keine Elemente hinzugefügt werden.

Robert
quelle
Akzeptiert eine parametrisierte Abfrage auch ArrayList als selectionArgs?
Skynet
7

Wie Tangens sagte, ist die Größe eines Arrays festgelegt. Aber Sie müssen es zuerst instanziieren, sonst ist es nur eine Nullreferenz.

String[] where = new String[10];

Dieses Array kann nur 10 Elemente enthalten. Sie können einen Wert also nur 10 Mal anhängen. In Ihrem Code greifen Sie auf eine Nullreferenz zu. Deshalb funktioniert es nicht. Verwenden Sie die ArrayList, um eine dynamisch wachsende Sammlung zu erhalten.

Simon
quelle
7
String[] source = new String[] { "a", "b", "c", "d" };
String[] destination = new String[source.length + 2];
destination[0] = "/bin/sh";
destination[1] = "-c";
System.arraycopy(source, 0, destination, 2, source.length);

for (String parts : destination) {
  System.out.println(parts);
}
dforce
quelle
6

Ich habe diesen Code gemacht! Es wirkt wie ein Zauber!

public String[] AddToStringArray(String[] oldArray, String newString)
{
    String[] newArray = Arrays.copyOf(oldArray, oldArray.length+1);
    newArray[oldArray.length] = newString;
    return newArray;
}

Ich hoffe du magst es!!

Engel
quelle
5

Sie müssen eine Sammlungsliste verwenden. Sie können ein Array nicht neu dimensionieren.

Paligulus
quelle
4

Wenn Sie Ihre Daten in einem einfachen Array wie diesem speichern möchten

String[] where = new String[10];

und Sie möchten einige Elemente wie Zahlen hinzufügen, bitte verwenden Sie uns StringBuilder, der viel effizienter ist als das Verketten von Strings.

StringBuilder phoneNumber = new StringBuilder();
phoneNumber.append("1");
phoneNumber.append("2");
where[0] = phoneNumber.toString();

Dies ist eine viel bessere Methode, um Ihren String zu erstellen und in Ihrem 'where'-Array zu speichern.

RMachnik
quelle
4

Hinzufügen neuer Elemente zum String-Array.

String[] myArray = new String[] {"x", "y"};

// Convert array to list
List<String> listFromArray = Arrays.asList(myArray);

// Create new list, because, List to Array always returns a fixed-size list backed by the specified array.
List<String> tempList = new ArrayList<String>(listFromArray);
tempList.add("z");

//Convert list back to array
String[] tempArray = new String[tempList.size()];
myArray = tempList.toArray(tempArray);
Kris
quelle
1
Ah, ich verstehe, Sie haben das <code>Tag verwendet und dies hatte Probleme mit den generischen Typen. Bitte versuchen Sie, dieses Tag zu vermeiden, da ... es Probleme gibt, und rücken Sie Ihren Code mit 4 Leerzeichen ein, um die richtige Formatierung zu erhalten. Ich habe das für deine Frage gemacht :).
Tom
4

Es gibt viele Möglichkeiten, einem Array ein Element hinzuzufügen. Sie können ein temporäres ListElement verwenden , um das Element zu verwalten und es dann wieder zu konvertieren, Arrayoder Sie können das verwenden java.util.Arrays.copyOfund es mit Generika kombinieren, um bessere Ergebnisse zu erzielen.

Dieses Beispiel zeigt Ihnen, wie:

public static <T> T[] append2Array(T[] elements, T element)
{
    T[] newArray = Arrays.copyOf(elements, elements.length + 1);
    newArray[elements.length] = element;

    return newArray;
}

Um diese Methode zu verwenden, müssen Sie sie nur so aufrufen:

String[] numbers = new String[]{"one", "two", "three"};
System.out.println(Arrays.toString(numbers));
numbers = append2Array(numbers, "four");
System.out.println(Arrays.toString(numbers));

Wenn Sie zwei Arrays zusammenführen möchten, können Sie die vorherige Methode folgendermaßen ändern:

public static <T> T[] append2Array(T[] elements, T[] newElements)
{
    T[] newArray = Arrays.copyOf(elements, elements.length + newElements.length);
    System.arraycopy(newElements, 0, newArray, elements.length, newElements.length);

    return newArray;
}

Jetzt können Sie die Methode folgendermaßen aufrufen:

String[] numbers = new String[]{"one", "two", "three"};
String[] moreNumbers = new String[]{"four", "five", "six"};
System.out.println(Arrays.toString(numbers));
numbers = append2Array(numbers, moreNumbers);
System.out.println(Arrays.toString(numbers));

Wie bereits erwähnt, können Sie auch ListObjekte verwenden. Es wird jedoch einen kleinen Hack erfordern, um es so sicher zu machen:

public static <T> T[] append2Array(Class<T[]> clazz, List<T> elements, T element)
{
    elements.add(element);
    return clazz.cast(elements.toArray());
}

Jetzt können Sie die Methode folgendermaßen aufrufen:

String[] numbers = new String[]{"one", "two", "three"};
System.out.println(Arrays.toString(numbers));
numbers = append2Array(String[].class, Arrays.asList(numbers), "four");
System.out.println(Arrays.toString(numbers));
Teocci
quelle
newArray[elements.length] = element;, meintest du newArray[elements.length - 1] = element;?
David Riccitelli
3

Ich bin nicht so erfahren in Java, aber mir wurde immer gesagt, dass Arrays statische Strukturen sind, die eine vordefinierte Größe haben. Sie müssen eine ArrayList oder einen Vektor oder eine andere dynamische Struktur verwenden.

npinti
quelle
2

Sie können eine Arrayliste erstellen und Collection.addAll()das String-Array in Ihre Arrayliste konvertieren

Ratzip
quelle
2

Sie können dies einfach tun:

System.arraycopy(initialArray, 0, newArray, 0, initialArray.length);
Jason Ivey
quelle
2

Wenn Sie die Größe eines Arrays wirklich ändern möchten, können Sie Folgendes tun:

String[] arr = {"a", "b", "c"};
System.out.println(Arrays.toString(arr)); 
// Output is: [a, b, c]

arr = Arrays.copyOf(arr, 10); // new size will be 10 elements
arr[3] = "d";
arr[4] = "e";
arr[5] = "f";

System.out.println(Arrays.toString(arr));
// Output is: [a, b, c, d, e, f, null, null, null, null]
In der Hälfte gebacken
quelle
1

Die Größe des Arrays kann nicht geändert werden. Wenn Sie ein Array verwenden müssen, können Sie Folgendes verwenden:

System.arraycopy(src, srcpos, dest, destpos, length); 
Jiao
quelle
0

Es ist auch möglich, ausreichend großen Speicher vorab zuzuweisen. Hier ist eine einfache Stapelimplementierung: Das Programm soll 3 und 5 ausgeben.

class Stk {
    static public final int STKSIZ = 256;
    public int[] info = new int[STKSIZ];
    public int sp = 0; // stack pointer
    public void push(int value) {
        info[sp++] = value;
    }
}
class App {
    public static void main(String[] args) {
        Stk stk = new Stk();
        stk.push(3);
        stk.push(5);
        System.out.println(stk.info[0]);
        System.out.println(stk.info[1]);
    }
}
baz
quelle