私はAPIドキュメントでList
にsort()
メソッドがあることを確認しましたが、パラメーターに何が必要かわかりません。現在必要なのは、非常に単純なストレートアルファ比較です。
質問をありがとう!次のように文字列のリストをソートできます。
_main() {
var fruits = ['bananas', 'apples', 'oranges'];
fruits.sort();
print(fruits);
}
_
上記のコードは以下を出力します:
_apples, bananas, oranges
_
sort()
は値を返さないことに注意してください。新しいリストを作成せずにリストをソートします。同じ行で並べ替えて印刷したい場合は、メソッドカスケードを使用できます。
_print(fruits..sort());
_
より細かく制御するために、独自の比較ロジックを定義できます。これは、価格に基づいて果物を並べ替える例です。
_main() {
var fruits = ['bananas', 'apples', 'oranges'];
fruits.sort((a, b) => getPrice(a).compareTo(getPrice(b)));
print(fruits);
}
_
ここで何が起こっているのか見てみましょう。
リストには sort メソッドがあり、これには1つのoptionalパラメータがあります:a Comparator 。コンパレータはtypedef
または関数のエイリアスです。この場合は、次のような関数のエイリアスです。
_int Comparator(T a, T b)
_
ドキュメントから:
コンパレーター関数は、aがbより小さい場合は負の整数、aがbと等しい場合はゼロ、aがbより大きい場合は正の整数を返すことにより、このような全体の順序を表します。
これを実現するための1行のコードを次に示します。
fruits.sort((String a, String b)=>a.compareTo(b)); //fruits is of type List<String>
遅延ソート(null許容値をソートできます)。
結果はIEnumerableです。
カスタムコンパレーターを引数として渡すことができます。
import 'package:queries/collections.Dart';
void main() {
var strings = ["c", "bb", "b", "cc", null, "a", 'ccc'];
var data = new Collection<String>(strings);
var query = data.orderBy((s) => s).thenBy((s) => s.length);
print(query.asIterable());
print(query.toList());
}
出力:
(null, a, b, bb, c, cc, ccc)
[null, a, b, bb, c, cc, ccc]
一般に、セスの詳細な回答にポイントを1つだけ追加するには
(a, b) => foo(a, b)
sort
に渡された関数foo
は、整数の結果に次のように応答する必要があります。
上記の三分法の法則が成立するためには、a
とb
の両方がComparable
sでなければなりません。
今日以降は、list.sort()を実行できるようになります。 sortメソッドの引数はオプションになりました。デフォルトでは、要素自体に対してcompareToを呼び出す関数になっています。 StringはComparableなので、今すぐ機能するはずです。