2013-10-18 7 views
5

Kolay bir program yazıyorum, bir dizi başka bir şekilde yanlış sıralanırsa doğru olarak döner ve tutulmada bir istisna tutmaya devam ediyorum ve nedenini anlayamıyorum. Birisi benim koduma bir göz atabilir ve neden bir dizi istisna dışında bir dizi alıyorum açıklamak istiyorum merak ediyordum. İleri düzeydeki yardımlarınız için teşekkür ederiz.Bir dizinin sıralanıp ayrılmadığını kontrol edin true veya false döndürün

public static boolean isSorted(int[] a) 
{ 

    int i; 
    for(i = 0; i < a.length; i ++);{ 
     if (a[i] < a[i+1]) { 
      return true; 
     } else { 
      return false; 
     } 
    } 
} 
public static void main(String[] args) 
{ 
      int ar[] = {3,5,6,7}; 
      System.out.println(isSorted(ar)); 
} 
+3

istisnayı geri yükle – Cruncher

+0

Kodunuzu çalıştırın. 4 girdiniz var, basit olmalı. Bir noktada 3'e eşit olacağım, [3 + 1] erişmeye çalışacak ne olacak? – cklab

+1

Dizin sınırlarınızı kontrol edin –

cevap

23

Diyelim ki inşa döngünün daha temiz bir sürümüne bakalım:

for (i = 0; i < a.length; i++); { 
    if (a[i] < a[i + 1]) { 
     return true; 
    } 
    else { 
     return false; 
    } 
} 

Ben ilk orijinal döngü içinde sözdizimi hatası işaret olmalıdır. Yani, döngü gövdesini başlatan küme ayracı ({) önce bir noktalı virgül (;) var. Bu noktalı virgül çıkarılmalıdır. Ayrıca, daha okunabilir hale getirmek için kodun beyaz alanını yeniden biçimlendirdiğimi de unutmayın.

Şimdi döngüsünüzde neler olduğunu konuşalım. Döngü yineleyicisi i0'dan başlar ve a.length - 1'da biter. i dizininizin bir dizini olarak işlev gördüğünden, a[0] öğesinin ilk öğesi ve a[a.length - 1] dizininizin son öğesi olduğunu belirtmek mantıklıdır. Ancak, döngünüzün gövdesinde de i + 1 bir dizin yazdınız. Bu, i'un a.length - 1'a eşit olması durumunda, dizininizin dizinin sınırları dışındaki a.length'a eşit olduğu anlamına gelir.

isSorted işlevi, a[i] < a[i+1] ilk kez true değerini döndürdüğü ve ilk kez yanlış olduğu için önemli sorunlara da sahiptir; ergo aslında dizi sıralanır olup olmadığını kontrol etmez! Daha ziyade, ilk iki girdinin sıralanıp ayrılmadığını kontrol eder.

benzer mantıkla bir işlev ama i == a.length sana o hatayı verecektir zaman gerçekten sıralanır dizisi

public static boolean isSorted(int[] a) { 
// Our strategy will be to compare every element to its successor. 
// The array is considered unsorted 
// if a successor has a greater value than its predecessor. 
// If we reach the end of the loop without finding that the array is unsorted, 
// then it must be sorted instead. 

// Note that we are always comparing an element to its successor. 
// Because of this, we can end the loop after comparing 
// the second-last element to the last one. 
// This means the loop iterator will end as an index of the second-last 
// element of the array instead of the last one. 
    for (int i = 0; i < a.length - 1; i++) { 
     if (a[i] > a[i + 1]) { 
      return false; // It is proven that the array is not sorted. 
     } 
    } 

    return true; // If this part has been reached, the array must be sorted. 
} 
+0

Yardımın için teşekkürler, şimdi anladım – user2101463

+0

@ user2101463 Yardım ettiğim için mutluyum –

+0

En kötü durum karmaşıklığı O (n). Verilerin normal bir dağılımdan rastgele seçilmiş olması nedeniyle ortalama zaman karmaşıklığı nedir? Gerçekten O (1) mi? Toplamı, diğer bir geometrik dizi olan ve yalnızca 4'ü n → ∞ ve dolayısıyla O'ya (1) veren bir başka geometrik dizi gibi görünüyor. Bu doğru mu? –

1

a[i+1] ise kontrol etmektedir.

Örneğin, uzunluğu 10, bir dizi olarak, aralık dışında olan a[10] gösterir,

a[i+1]i 9 olan 9'a elemanları 0 sahiptir.

düzeltmek için:
for(i=0; i < a.length-1;i++) 

Ayrıca, kod, tüm dizi boyunca kontrol etmez kısa sürede dönüş olarak adlandırılan, kontrol döngü sonlandırılır. Sadece ilk değeri ve sadece ilk değeri kontrol ediyorsunuz.

VE varsa siz de yaşanan sorunlar bu ifade ile

+0

Ahhhh! Şimdi görüyorum, yardımınız için teşekkür ederiz – user2101463

2

, a[i+1] neden olan döngü beyanı için, sen dizinin sonunu kaçıyorsun sonra bir noktalı virgül var.

// stop one loop early ---v  v--- Remove semicolon here 
for(i = 0; i < a.length - 1; i ++){ 
0

Sen a[i+1] kullanmamalısınız: Bir sonraki öğeye karşılaştırmak gerekir

sonra (Java for döngü organı olarak yorumlamak olur noktalı virgül ve ortadan kaldırmak) erken yineleme 1 elemanını durdurmak Çünkü bu değer diziden çıkabilir veya olmayabilir. Örneğin

:

A = {1, 2, 3} 
// A.length is 3. 
for(i = 0; i < a.length; i ++) // A goes up to 3, so A[i+1] = A[4] 

Bunu düzeltmek için, sadece döngü bir erken durdurun.

int i; 
for(i = 0; i < a.length - 1; i ++);{ 

    if (a[i] < a[i+1]) { 

     return true; 
    }else{ 
     return false; 

    } 

} 
+0

bir int dizisi boş olamaz. Ayrıca kodunuz istisnayı çözerken, aslında metodun –

+0

elde etmek için ayarladığı şeyi başaramadığı için özür dileriz. Sabit. – dtgee

1

Dizinin sıralanıp sıralanmadığını kontrol etmek için dizideki bitişik öğeleri karşılaştırabiliriz. null & a.length == 0

public static boolean isSorted(int[] a){  

    if(a == null) { 
     //Depends on what you have to return for null condition 
     return false; 
    } 
    else if(a.length == 0) { 
     return true; 
    } 
    //If we find any element which is greater then its next element we return false. 
    for (int i = 0; i < a.length-1; i++) { 
     if(a[i] > a[i+1]) { 
      return false; 
     }   
    } 
    //If array is finished processing then return true as all elements passed the test. 
    return true; 
} 
2
int i; 
for(i = 0; i < a.length - 1 && a[i] < a[i+1]; i++){} 
return (i == a.length - 1); 
  • sınır koşulları için

    Kontrol sadece değil ilk eğer ilk bölümü ist yanlış

  • durur işlenmez dizi elemanlarını, son durumun son bölümünü erişir sıralı öğe
-3

Array.prototype.every

her() dizideki tüm elemanlar temin fonksiyonu tarafından uygulanan testi geçmek yöntem test eder.

arr.every(function (a, b) { 
    return a > b; 
}); 

var arr = [1,2,3] // true 

var arr = [3,2,1] // false 
+0

, bunun java hakkında bir soru olduğunu, ancak src'yi incelediğini fark etti.her() bir miktar ışık tutacaktır;) – iamwhitebox

+0

Bu cevap sadece js' için değil, aynı zamanda yapması gereken şeyi yapmadığı için de yanlıştır. 'her 'işlevi, yalnızca bir elemanın sınandığını test eder, bu nedenle' b' argümanı' a' elemanının indisidir. Böylece sağlanan fonksiyon sadece "arr [i]> i" ise test eder. '' [5, 3, 5] '' 'true' döndürürken,' [0, 1, 2] 'için' false' döndürür. –

0

Azalan bir dizi de sıralanır. Dizi Artan amacıyla olup olmadığını

public static boolean isSorted(int[] a){ 
    boolean isSorted = true; 
    boolean isAscending = a[1] > a[0]; 
    if(isAscending) { 
     for (int i = 0; i < a.length-1; i++) { 
      if(a[i] > a[i+1]) { 
       isSorted = false; 
       break; 
      }   
     } 
    } else {//descending 
     for (int i = 0; i < a.length-1; i++) { 
      if(a[i] < a[i+1]) { 
       isSorted = false; 
       break; 
      }   
     } 
    }  
    return isSorted; 
} 
0
public static boolean isSorted(int[] a) 
{ 
    for (int i = 0; i < a.length - 1 ; i++) { 
     if (a[i] > a[i+1]) 
      return false; 
    } 
    return true; 
} 

Bu fonksiyon, kontrol: artan ve azalan diziler hem de hesaba katılması için, aşağıdaki kullanın.

+1

Cevabınızı açıklar mısınız lütfen? –

+3

Yığın Taşmasına Hoş Geldiniz! Bu kod pasajı soruyu çözebilirken, * nasıl * ve * niçin * bunun bir açıklaması da dahil olmak üzere, yazınızı iyileştirmek için [// meta.stackexchange.com/q/114762] sorunu çözer. Gelecekte okuyucular için soruyu cevapladığınızı unutmayın, sadece şimdi soran kişi için değil! Lütfen cevabınızı açıklama eklemek için düzenleyin ve hangi sınırlamaların ve varsayımların geçerli olduğuna dair bir gösterge verin. –

+0

Taşma yığınına hoş geldiniz :-) Lütfen [cevap] 'a bakın. Kodunuzun sorunu nasıl çözdüğü hakkında biraz bilgi vermelisiniz. Yalnızca kod yanıtları topluluk için yararlı değildir. – JimHawkins