2012-05-17 17 views
7

Listemden belirli öğeleri kaldırmak istiyorum. Listede tekrarlarken bunu yapmak istemiyorum. Silinmesi gereken değeri belirtmek istiyorum. javadocs ben Bu benim kodudur işlevi List.remove(Object 0) bulundu:java.lang içinde bir değer kaldırılıyor <String> java.lang.UnsupportedOperationException

  String str="1,2,3,4,5,6,7,8,9,10"; 
     String[] stra=str.split(","); 
     List<String> a=Arrays.asList(stra); 
     a.remove("2"); 
     a.remove("3"); 

Ama bir özel durum almak: java.lang.UnsupportedOperationException

cevap

22

sorun Arrays.asList() ekleme/kaldırma desteklemeyen bir liste (sadece var döndürür olmasıdır, stra numaralı telefona bir bakış.

List<String> a = Arrays.asList(stra); 

için:

List<String> a = new ArrayList<String>(Arrays.asList(stra)); 

Böyle mi değiştirme imkanı sağlayan listesinin bir kopyasını oluşturur

değişiklik düzeltmek için.

+0

Çalışıyor. teşekkürler Benim yöntemimle yanlış olan neydi? Liste a = Arrays.asList (stra); Bu satırda istisna atılmadı. – Ashwin

+0

@Ashwin: Bu hat iyiydi. Ancak, Arrays.asList() 'tarafından üretilen liste salt okunurdur, bu yüzden değiştiremezsiniz. Önce bir kopya çıkarmalısın. – NPE

+0

tamam .. yöntemimle sadece [] değerleri doğrudan kendi kopyasını oluşturmadan erişen liste oldu? Yani herhangi bir değişikliğe izin verildiği takdirde, String [] 'i de etkileyecekler mi? – Ashwin

2

http://docs.oracle.com/javase/6/docs/api/java/util/Arrays.html#asList%28T...%29

bu Bkz. Arrays.asList sabit bir liste döndürür. Bu değişmez olanıdır. Tanımı gereği, o nesneyi oluşturduktan sonra değiştiremezsiniz. Bu yüzden desteklenmeyen bir istisna atıyor.

+1

Bir dize de değişmez. Ancak bir dizgeyi değiştirdiğinizde yeni bir bellek konumu tahsis edilir ve dahili olarak yeni bir dizi oluşturulur. Böylece etkili bir şekilde değişmez bir dizeyi değiştirebilirsiniz. Bu yüzden burada düşünmüyorum çünkü geri dönen liste değişmez. Sanırım Arrays.asList() işlevini yaptığınızda, sadece [] dizesini [] ([] dizesini kopyalamaz ve bir liste oluşturmaz) kullanır. – Ashwin

+0

İç sınıfın Arrays sınıfındaki AraayList çağrısına bir göz atmanız durumunda, bunun değiştirilemeyeceğini anlayacaksınız. Sadece özel bir final E [] a kullanın; Geri dönen listeyi değiştirememenizin nedeni budur. Dize durumunda oluşturduğunuzda bir dizeyi değiştiremezsiniz. Ancak dize sınıfında API, yeni bir nesne oluşturarak dahili olarak modifikasyonları ele alacak şekilde geliştirildi. –

+0

Yani, [] dizesinin bir kopyasını oluşturduğunu ancak son olarak ilan ettiğini söylüyorsunuz. dize [] 'yi referans göstermediğini ve kendi kopyasını (ancak final olarak) sakladığını mı söylüyorsun? – Ashwin

İlgili konular