Neden ben listeden kaldırmak için çalışırken UnsupportedOperationException? | Netgez.com
SORU
3 HAZİRAN 2010, PERŞEMBE


Neden ben listeden kaldırmak için çalışırken UnsupportedOperationException?

Bu kod var:

public static String SelectRandomFromTemplate(String template,int count) {
   String[] split = template.split("|");
   List<String> list=Arrays.asList(split);
   Random r = new Random();
   while( list.size() > count ) {
      list.remove(r.nextInt(list.size()));
   }
   return StringUtils.join(list, ", ");
}

.

06-03 15:05:29.614: ERROR/AndroidRuntime(7737): java.lang.UnsupportedOperationException
06-03 15:05:29.614: ERROR/AndroidRuntime(7737):     at java.util.AbstractList.remove(AbstractList.java:645)

Bu nasıl doğru olabilir? Java.15

CEVAP
3 HAZİRAN 2010, PERŞEMBE


Kod ile epeyce sorunlar:

Arrays.asList sabit boyutlu bir listesi dönüyoruz

API:

Arrays.asList: Döndürürsabit boyutlu listesibelirtilen dizi tarafından desteklenmektedir.

Bunun için 8**; remove. List yapısal olarak değiştiremezsiniz.

Düzeltme

12 ** daha hızlı destekler LinkedList, oluşturun.

List<String> list = new LinkedList<String>(Arrays.asList(split));

split düzenli alıyor

API:

String.split(String regex): bu maçları regular expression verilen bu dize Böler.

| düzenli ifade karakter; eğer 17 ** bir edebi üzerinde bölmek istiyorsanız Java bir dize olarak "\\|" \|, kaçmak gerekir.

Düzeltme:

template.split("\\|")

Daha iyi bir algoritma

Yerine arama remove bir zaman rastgele endeksleri, daha iyi oluşturmak için yeterli rasgele sayı aralığı, ve sonra geçiş yapma List ile listIterator() arama remove() en uygun endeksleri. Belirli bir aralıktaki ama farklı sayılar üretmek için nasıl stackoverflow üzerinde soru var.

Bu, algoritma O(N) olurdu.

Bunu PaylaÅŸ:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Electro Posé

    Electro PosÃ

    21 ÅžUBAT 2013
  • SomeOne Pro

    SomeOne Pro

    25 EKİM 2013
  • SPBedition

    SPBedition

    24 HAZİRAN 2013