2012-10-15 19 views

答えて

12

ご質問ありがとうございます!上記のコードが印刷さ

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

:あなたはこのような文字列のリストを並べ替えることができますsort()が値を返さないこと

apples, bananas, oranges 

お知らせ。新しいリストを作成せずにリストをソートします。

print(fruits..sort()); 

は、より多くのコントロールのために、あなたがあなた自身の比較ロジックを定義することができます:あなたが並べ替えると同じ行に印刷したい場合は、方法カスケードを使用することができます。ここでは、価格に基づいて果物を分類する例を示します。

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

ここでは何が起こっているのか見てみましょう。

リストにはsortメソッドがあり、オプションのパラメータ:Comparatorがあります。コンパレータはtypedefまたは関数のエイリアスです。ドキュメントから

int Comparator(T a, T b) 

:この場合、それはのように見える関数のエイリアスです

より小さければコンパレータ機能が 負の整数を返すことによって、このような全順序を表し、 bがaと等しい場合は0、bがbより大きい場合は は正の整数です。次のように

+0

ありがとう!申し訳ありませんが、上記のような多彩な機能を評価しようとしていますが、以前の言語体験と直感的でインラインではありません。あなたには正方形の木製のマウスと長い灰色のひげがこのようなもののいくつかで登場する誰かを持っていますか? :) –

+1

これは不思議な歴史的遺物です。コンパレータはオプションです。これまでは、オプションのパラメータ構文を変更していましたが、これを含めて、すべてのパラメータをしばらく非選択にする必要がありました。私たちはこれを修正して、もう一度オプションにするチャンスを得られませんでした。 – munificent

+0

ありがとうございます@すぐに修正されることを嬉しく思います。バグhttp://code.google.com/p/dart/issues/detail?id=1235をご覧ください。 –

2

sortに渡さ

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

で、一般的には、セスの詳細な回答にただ一点を追加するには、機能fooは、整数の結果に答える必要があります。

  • 場合< bの場合、結果は<,0,
  • 、a = b、結果は0、および
  • 0である必要があります。
  • 場合> B、結果はComparable Sでなければならない> 0
保持するtrichotomyの上記法則について

、両方abであるべきです。

0

今日の後、あなたはlist.sort()を実行できるはずです。 ソートメソッドの引数は現在オプションで、デフォルトでは、要素自体に対してcompareToを呼び出す関数になっています。 StringはComparableなので、今すぐ動作するはずです。

+0

リストsort()メソッドはコンパレータ関数を必要としないように修正されましたか?あるいは退行があったか?私はUbuntu 12.04でDart 0.2.6.0_r15355を使用し、次の結果を得ています:[3,1,2] .sort()== nullと ['a'、 'c'、 'b']。sort )== null。 – devdanke

+0

おっと! Dartは配列をソートしていましたが、sort()関数はvoidを返します:-(したがって "print([3,1,2] .sort())" "は" null "を出力します。流暢なプログラミングスタイルを実装していないので、そうしたいと思っています。そのため、すぐにsort()を呼び出した結果を使用することができます。 – devdanke

2

レイジーソーティング。結果はIQueryableです。

カスタムコンパレータを引数として渡すことができます。

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); 
    } 
} 

出力:

mango 
banana 
orange 
blueberry 
raspberry 
passionfruit 
関連する問題