2016-04-01 14 views
2

Bir dizi listesi veri yapısında Josephus sorununu çözmeye çalışıyorum ve görev ListIterator'ı kullanmak. Kaldırma kısmına takılıyorum.Listiterator ile ilgili kaygıları kaldır java

10 askerin peşine düştüğümü söyleyelim - 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 Ve her 3 askeriye adım atmalıyım - yani 3, sonra 6, sonra 9, vb.

başarıyla 3 kaldırmak mümkün, ama bir dahaki sefer 7 kaldırır ve 6. kodumu gözden geçirin ve yanlış ne yapıyorum söyleyebilir:

private static int suicide (List<Integer> list, int step) { 

     ListIterator<Integer> itr = list.listIterator(); 

     while(itr.hasNext()&& list.size() != 1){ 

      if((itr.nextIndex()+1) % step == 0) { 
       System.out.println(itr.previousIndex()+1); 
       itr.next(); 
       itr.remove(); 
       itr.next(); 
      } 
      else { 
       itr.next(); 
      } 

      if(!itr.hasNext()){ 

       itr=list.listIterator(); 
      } 
     } 
     return 0; 
    } 
+0

Sorun şu ki, elemanlar endekste hareket ediyor ve mantığıma göre element 7, '5' indeksinde (mantıksal olarak 6) ve böylece siliniyor. Bunu nasıl durduracağımı anlamak istiyorum. – user4261932

cevap

0

Bir olasılık, sen misin listenin bir kopyasını yapın ve bu kopyadaki öğeleri kaldırın, yine de "orijinal" i (yinelenen kopyadaki yineleyici adımı atlayarak) yineleyin.

ListIterator itr = list.listIterator(); ListIterator itr2 = copy.listIterator();

while(itr.hasNext()&& list.size() != 1){ 

    if((itr.nextIndex()+1) % step == 0) { 
     System.out.println(itr.previousIndex()+1); 
     itr.next(); 
     itr2.next(); 
     itr2.remove(); 
     itr.next(); 
    } 
    else { 
      itr.next(); 
      itr2.next(); 
     } 
0

Bunu deneyin;

int i = 3; 
int step = 1; 

while (list.size() > i) { 
    list.remove(i); 
    step++; 
    i = 3 * step - step + 1; 
} 
0

Tasarım mantığına geri dönün!

Kabul edilen öğelerle yeni bir Liste oluşturmak yalnızca en iyi yaklaşımdır.

Sökmek ve korumak her zaman daha zordur. Örneğin, intihar yöntemini, istediğiniz öğelerle birlikte yeni bir Liste <> döndürmeniz gerekir.

Kodunuz gerçekten basit olacaktır:

List<Integer> cleanedList = new ArrayList<Integer>(); 
for(Integer soldier : list) { 
    if(solider%3!=0){ 
     cleanedList.add(soldier); 
    }  
} 
return cleanedList; 

çoğu zaman yeni objets oluşturur API tercih ederim. Bu kuralı uygularsanız, kod her zaman daha basit bir kod alır! Ve parametreleri güncellemek iyi bir davranış değildir: yöntemi iki kez çağırırsanız, iki farklı sonuç elde edersiniz.

+0

Ama ilk sırada her 3 girişi (yani anladım) kaldırmak istedim, ve sadece 3'e bölebilen bir giriş değil. Kodunuz onun "Hadi deyin" için çalışıyor. 1. – Martin

+0

Haklısınız ama bunu index ile yapabilirsiniz (int i = 0) ve liste indeksiniz olan yerde çalışır. –

İlgili konular