2012-10-15 29 views

cevap

12

Soru için teşekkürler! Böyle Strings listesini sıralayabilirsiniz:

main() { 
    var fruits = ['bananas', 'apples', 'oranges']; 
    fruits.sort(); 
    print(fruits); 
} 

Yukarıdaki kod baskılar: Bir değer döndürmez

apples, bananas, oranges 

Bildirimi sort() söyledi. Listeyi yeni bir liste oluşturmadan sıralar.

print(fruits..sort()); 

fazla kontrol için, kendi karşılaştırma mantığı tanımlayabilirsiniz: sıralayıp aynı çizgide yazdırmak istiyorsanız, yöntem kaskadlar kullanabilirsiniz. İşte meyveleri fiyatlara göre sıralamak için bir örnek.

main() { 
    var fruits = ['bananas', 'apples', 'oranges']; 
    fruits.sort((a, b) => getPrice(a).compareTo(getPrice(b))); 
    print(fruits); 
} 

Bakalım neler oluyor burada.

Bir liste, bir isteğe bağlı parametresi olan bir yöntemine sahiptir: a Comparator. Bir Karşılaştırıcı, bir typedef veya işlev takma adıdır.

Bir karşılaştırıcı işlevi küçükse bir negatif tamsayı dönerek böyle bir toplam düzenlenmesini temsil

: Dokümanlar

int Comparator(T a, T b) 

: Bu durumda, şöyle bir işlev için bir takma ad b, a, b'ye eşitse sıfır ve a, b'den büyükse pozitif bir tamsayıdır. aşağıdaki gibi

+0

teşekkürler! Şikayet ettiğim için özür dilerim, ancak yukarıdakilerin çok yönlülüğünü takdir etmeye çalışırken, sezgisel ya da önceki dil deneyimi ile aynı çizgiyi bulamıyorum. Kare ahşap bir faresi olan ve bu eşyaların bir kısmının uzun gri sakallı biri var mı? :) –

+1

Bu garip bir tarihsel eserdir. Karşılaştırıcı isteğe bağlı olmalıdır. Eskiden olduğu gibi, isteğe bağlı parametre sözdizimini bir süre sonra değiştirdik ve bu da dahil olmak üzere tüm parametreleri bir süreliğine opsiyonel hale getirmemizi sağladı. Bunu düzeltmek ve henüz tekrar isteğe bağlı hale getirmek için bir şansımız olmadı. – munificent

+0

Teşekkürler @munificent, yakında düzeltileceğini duyduğumuza sevindim. Hataya bakın http://code.google.com/p/dart/issues/detail?id=1235 –

2

sort geçirilen

(a, b) => foo(a, b) 

yılında, genel olarak, Seth'in ayrıntılı cevaba sadece bir nokta eklemek için, işlev foo bir tamsayı sonucunu cevap vermelidir:

  • bir eğer < b, sonuç < 0,
  • olmalıdır, a = b ise sonuç = 0 ve
  • olmalıdır
  • bir if> b sonuç Comparable s olmalıdır> 0.
tutmak için trichotomy yukarıdaki yasa için

, hem a ve b olmalıdır.

0

Bugünden sonra, sadece list.sort() yapabilmeniz gerekir. Sıralama yönteminin argümanı artık isteğe bağlı ve varsayılan olarak, öğelerin kendileriyle compareToTo çağrılan bir işleve dönüşür. Dize Karşılaştırılabilir olduğundan, Şimdi Çalışmalı.

+0

Bir karşılaştırıcı işlevi gerektirmeyen List sort() yöntemi hiç düzeltildi mi? Yoksa regresyon var mıydı? . Ben Ubuntu 12.04 üzerinde Dart'ı 0.2.6.0_r15355 kullanarak ve aşağıdaki sonuçlar alıyorum: sort [3,1,2] .sort() == null ve [ 'a', 'c', 'b'] () == null. – devdanke

+0

Oops! Dart dizisini sıralamaktaydı. Ama sort() işlevi void :-(döndürür. Yani "print ([3,1,2] .sort()) '" outputs "null". Bu durumda Dart devleri akıcı bir programlama stili uygulamıyor, keşke yapabilseydim çünkü o zaman derhal sort() sonucunu kullanabilirsiniz. – devdanke

2

Tembel sıralama. Sonuç IQueryable.

Özel karşılaştırıcı bir argüman olarak geçirilebilir.

import 'package:queries/collections.dart'; 

void main() { 
    var fruits = ["grape", "passionfruit", "banana", "mango", 
       "orange", "raspberry", "apple", "blueberry"]; 

    var sorted = new Collection(fruits) 
    .orderBy((fruit) => fruit.length) 
    .thenBy((fruit) => fruit); 

    for(var fruit in sorted) { 
    print(fruit); 
    } 
} 

Çıktı:

mango 
banana 
orange 
blueberry 
raspberry 
passionfruit 
İlgili konular