リストから冗長な(文字列) 要素を削除する必要があります。それとも、そもそもそれらが入力されないようにすることがより良い解決策でしょうか? セットは重複を許可しませんが、順序も維持されず、順序が必要です。これは私にとってよくある問題なので、完全に効率化できる言語ソリューションを探しています。
(過去に、配列クラスを拡張して独自の add_unique() メソッドを追加しましたが、これは、言語によって処理され、おそらくより効率的に処理されるのに十分一般的な問題のようです。)
ありがとう、
_g
一意性のみを含み、挿入順序を維持するにはLinkedSetが必要ですが、現在、dartにはありません。ただし、LinkedHashMapを使用してLinkedSetをエミュレートできます。
var input = ["apple", "orange", "cherries", "pears", "apple", "apple", "orange"];
var uniques = new LinkedHashMap<String, bool>();
for (var s in input) {
uniques[s] = true;
}
for (var key in uniques.getKeys()) {
print ("$key");
}
現在、これは手動で行う必要があります。Dart では、挿入順序を保持するセットを提供していません。Dart コンテナ ライブラリが改良される予定であることに注意してください。www.dartbug.com にアクセスして、この機能リクエストを追加してください。これを手動で行うには、次のことができます。
1) 追加する前に indexOf を呼び出します。2) セットとリストを維持します。リストが順序を維持している間、セットを使用して物事を一意に保つことができます。
1をお勧めします。
ジョン
リストをそのまま使用し、cutch前述のように独自のメソッドを手動で追加して、重複を確認し、以下のような並べ替えを行うことができます。
import 'dart:html';
var someList = new List<String>();
String newItem = '';
void main() {
newItem = 'item 3';
if(!itemExistsInList(someList, newItem)){
someList.add(newItem);
sortList(someList);
}
// expected item 3
print(someList);
newItem = 'item 1';
if(!itemExistsInList(someList, newItem)){
someList.add(newItem);
sortList(someList);
}
// expected item 1, item 3
print(someList);
newItem = 'item 3';
if(!itemExistsInList(someList, newItem)){
someList.add(newItem);
sortList(someList);
}
// expected item 1, item 3. Same as previous as secondary item 3 was not added
print(someList);
}
// returns true if the specified item already exists in the specified list
// otherwise false
bool itemExistsInList(List<String> list, String item){
return list.some((v) => v.indexOf(item) != -1);
}
// sorts the list
void sortList(List<String> list){
list.sort((a, b) => a.compareTo(b));
}
sortList()追加するたびに関数を呼び出す必要はありません。これはデモンストレーションのためだけに行いました。実際に必要なときにだけ呼び出すだけで十分です。
.sort()で.some()あり、 DART ライブラリ ドキュメント.indexOfのコレクション セクションで詳しく説明されています。
**Several packages exist that expand on default the Iterable utility methods, such as flinq or darq. They add a distinct method you can call to easily get a list of unique members of a list based on some property of the members.**
import 'package:darq/darq.dart';
void main() {
var list = [
Data('a'),
Data('a'),
Data('b'),
Data('c'),
];
var distinct = list.distinct((d) => d.id).toList();
}