Hvordan legge til nye elementer i en matrise?

Jeg har følgende kode:

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

Disse to vedleggene kompilerer ikke. Hvordan fungerer det riktig?

Løsning

Størrelsen på en matrise kan ikke endres. Hvis du vil ha en større matrise, må du instansiere en ny.

En bedre løsning ville være å bruke en ArrayList som kan vokse etter behov. Metoden ArrayList.toArray( T[] a ) gir deg tilbake arrayet ditt hvis du trenger det i denne formen.

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

Hvis du trenger å konvertere det til et enkelt array...

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

Men de fleste ting du gjør med et array kan du også gjøre med denne ArrayList:

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

// get specific items
where.get( 1 );
Kommentarer (3)

Bruk en List, for eksempel en ArrayList. Den kan vokse dynamisk, i motsetning til arrayer (se: 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]"

Hvis du insisterer på å bruke matriser, kan du bruke java.util.Arrays.copyOf for å tildele en større matrise for å få plass til det ekstra elementet. Dette er imidlertid ikke den beste løsningen.

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

Dette er O(N) per append. ArrayList, derimot, har O(1) amortisert kostnad per operasjon.

Se også

Java Tutorials/Arrays * Java Tutorials/Arrays

Kommentarer (1)

Som tangens sa, er størrelsen på en matrise fast. Men du må instansiere det først, ellers vil det bare være en nullreferanse.

String[] where = new String[10];

Denne matrisen kan bare inneholde 10 elementer. Så du kan bare legge til en verdi 10 ganger. I koden din har du tilgang til en nullreferanse. Det er derfor det ikke fungerer. For å ha en dynamisk voksende samling, bruk ArrayList.

Kommentarer (0)