Aşağıdaki koda sahibim:
String[] where;
where.append(ContactsContract.Contacts.HAS_PHONE_NUMBER + "=1");
where.append(ContactsContract.Contacts.IN_VISIBLE_GROUP + "=1");
Bu iki ekleme derlenmiyor. Bu nasıl doğru çalışır?
Bir dizinin boyutu değiştirilemez. Eğer daha büyük bir dizi istiyorsanız, yeni bir dizi oluşturmanız gerekir.
Daha iyi bir çözüm, ihtiyaç duyduğunuzda büyüyebilen bir ArrayList
kullanmak olacaktır. ArrayList.toArray( T[] a )` yöntemi, bu biçimde ihtiyacınız varsa dizinizi size geri verir.
List<String> where = new ArrayList<String>();
where.add( ContactsContract.Contacts.HAS_PHONE_NUMBER+"=1" );
where.add( ContactsContract.Contacts.IN_VISIBLE_GROUP+"=1" );
Basit bir diziye dönüştürmeniz gerekiyorsa...
String[] simpleArray = new String[ where.size() ];
where.toArray( simpleArray );
Ancak bir dizi ile yaptığınız çoğu şeyi bu ArrayList ile de yapabilirsiniz:
// iterate over the array
for( String oneItem : where ) {
...
}
// get specific items
where.get( 1 );
Bir ArrayList<String>
gibi bir List<String>
kullanın. Dizilerin aksine dinamik olarak büyüyebilir (bkz: Effective Java 2nd Edition, Madde 25: Listeleri dizilere tercih edin).
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]"
Dizi kullanmakta ısrar ediyorsanız, ek öğeyi barındıracak daha büyük bir dizi ayırmak için java.util.Arrays.copyOf
kullanabilirsiniz. Yine de bu gerçekten en iyi çözüm değildir.
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]"
Bu, append
başına O(N)
dir. Öte yandan ArrayList
, işlem başına O(1)
amorti edilmiş maliyete sahiptir.
Tangens'in dediği gibi, bir dizinin boyutu sabittir. Ancak önce onu örneklemeniz gerekir, aksi takdirde yalnızca bir null referans olacaktır.
String[] where = new String[10];
Bu dizi yalnızca 10 eleman içerebilir. Yani bir değeri yalnızca 10 kez ekleyebilirsiniz. Kodunuzda bir null referansa erişiyorsunuz. Bu yüzden çalışmıyor. Bir diziye sahip olmak için Dinamik olarak büyüyen koleksiyon için ArrayList kullanın.