web-dev-qa-db-ja.com

Dartで文字列のリストをソートするにはどうすればよいですか?

私はAPIドキュメントでListsort()メソッドがあることを確認しましたが、パラメーターに何が必要かわかりません。現在必要なのは、非常に単純なストレートアルファ比較です。

32
george koller

質問をありがとう!次のように文字列のリストをソートできます。

_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より大きい場合は正の整数を返すことにより、このような全体の順序を表します。

38
Seth Ladd

これを実現するための1行のコードを次に示します。

fruits.sort((String a, String b)=>a.compareTo(b)); //fruits is of type List<String>
8

遅延ソート(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]
6
mezoni

一般に、セスの詳細な回答にポイントを1つだけ追加するには

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

sortに渡された関数fooは、整数の結果に次のように応答する必要があります。

  • a <bの場合、結果は<0でなければなりません。
  • a = bの場合、結果は= 0である必要があります。
  • a> bの場合、結果は> 0になります。

上記の三分法の法則が成立するためには、abの両方がComparablesでなければなりません。

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

1
Lasse Nielsen