다트의 평등에 대한 목록을 어떻게 비교할 수 있습니까?
다트에 있는 두 개의 목록을 이렇게 비교하고 있습니다.
main() {
if ([1,2,3] == [1,2,3]) {
print("Equal");
} else {
print("Not equal");
}
}
하지만 그들은 결코 동등하지 않습니다.그런 일은 없을 것 같습니다.equal()
목록 또는 컬렉션을 비교하는 Dart API의 메서드입니다.이것을 하는 적절한 방법이 있습니까?
Gunter의 답변을 완료하기 위해: 동일성이 아닌 동일성에 대한 목록을 비교하는 권장 방법은 다음 패키지의 동일성 클래스를 사용하는 것입니다.
import 'package:collection/collection.dart';
편집: 1.13 이전에는 'package:collection/equality.dart'를 가져오기도 했습니다.
예:
Function eq = const ListEquality().equals;
print(eq([1,'two',3], [1,'two',3])); // => true
위의 인쇄물true
왜냐하면 해당 목록 요소는identical()
다른 컬렉션을 포함할 수 있는 목록을 심층적으로 비교하려면 대신 다음을 사용합니다.
Function deepEq = const DeepCollectionEquality().equals;
List list1 = [1, ['a',[]], 3];
List list2 = [1, ['a',[]], 3];
print( eq(list1, list2)); // => false
print(deepEq(list1, list2)); // => true
다양한 방식으로 결합될 수 있는 다른 평등 클래스가 있습니다. 예를 들어, 다음과 같은 평등 클래스가 있습니다.Map
컬렉션을 순서 없이(심층적으로) 비교할 수도 있습니다.
Function unOrdDeepEq = const DeepCollectionEquality.unordered().equals;
List list3 = [3, [[],'a'], 1];
print(unOrdDeepEq(list2, list3)); // => true
자세한 내용은 패키지 API 설명서를 참조하십시오.평소처럼, 그러한 패키지를 사용하려면 당신은 그것을 당신의 웹사이트에 나열해야 합니다.pubspec.yaml
:
dependencies:
collection: any
Flutter를 사용하는 사용자의 경우 기본 기능이 있으며, 이 기능은 심층 동등성을 비교합니다.
import 'package:flutter/foundation.dart';
var list1 = <int>[1, 2, 3];
var list2 = <int>[1, 2, 3];
assert(listEquals(list1, list2) == true);
import 'package:flutter/foundation.dart';
var list1 = <int>[1, 2, 3];
var list2 = <int>[3, 2, 1];
assert(listEquals(list1, list2) == false);
설명서에 따라 다음을 수행합니다.
위의 용어 "깊이"는 첫 번째 평등 수준을 나타냅니다: 만약 요소들이 지도, 목록, 집합 또는 다른 집합/복합 객체라면, 요소들의 값들은 그들의 동등 연산자가 아니면 요소별로 비교되지 않습니다.
Object.operator==
) 그렇게 합니다.
따라서 무한한 수준의 평등을 찾고 있다면 Patrice Chalin이 제안한 대로 확인해 보십시오.
또한 다양한 컬렉션에 대해 이러한 기능이 필요한지 여부도 확인할 수 있습니다.
다트의 컬렉션은 본질적으로 평등하지 않습니다.두 집합이 요소와 정확히 같은 개체를 포함하더라도 동일하지 않습니다.
컬렉션 라이브러리는 이러한 동일성을 정의하는 메서드를 제공합니다.이 경우, 예를 들어.
IterableEquality().equals([1,2,3],[1,2,3])
는 두 개의 리스트가 동일한 요소를 포함하는 경우 정확히 동일하다고 간주하는 등식입니다.
나는 이것을 우연히 발견했습니다.
import 'package:collection/equality.dart';
void main(List<String> args) {
if (const IterableEquality().equals([1,2,3],[1,2,3])) {
// if (const SetEquality().equals([1,2,3].toSet(),[1,2,3].toSet())) {
print("Equal");
} else {
print("Not equal");
}
}
더 많은 정보 https://github.com/dart-lang/bleeding_edge/tree/master/dart/pkg/collection
기본 제공 목록 Equals, setEquals 및 mapEquals 함수를 사용하여 지금 동일성을 확인할 수 있습니다.
다음은 문서에 대한 링크입니다: https://api.flutter.dev/flutter/foundation/listEquals.html
이 질문은 다소 오래되었지만 기능은 여전히 Dart에 기본적으로 적용되지 않았습니다. 평등했습니다.List<List>
)), :), 그서나는지재인호출위빌에렸다니습서.
bool _listsAreEqual(list1, list2) {
var i=-1;
return list1.every((val) {
i++;
if(val is List && list2[i] is List) return _listsAreEqual(val,list2[i]);
else return list2[i] == val;
});
}
type(즉, 컬렉션 유형)을 혼합할 에도 실패합니다.List<Map>
- 다룹니다. - 그냥다다니룹다다▁).List<List<List>>
등등.
이에 대한 최신 다트 이슈는 https://code.google.com/p/dart/issues/detail?id=2217 (2013년 5월 마지막 업데이트)인 것 같습니다.
Dart에서 두 int 목록의 동일성을 비교하는 간단한 솔루션은 목록에서 요소의 순서를 확인하지 않고 세트를 사용하는 것입니다.
void main() {
var a = [1,2,3];
var b = [1,3,2];
var condition1 = a.toSet().difference(b.toSet()).isEmpty;
var condition2 = a.length == b.length;
var isEqual = condition1 && condition2;
print(isEqual); // Will print true
}
Built Collections 라이브러리는 평등, 해싱 및 기타 장점을 포함하는 Dart용 불변 컬렉션을 제공합니다.
만약 여러분이 평등을 요구하는 어떤 일을 하고 있다면, 여러분은 불변성을 가진 더 나은 삶을 살 가능성도 있습니다.
때때로 목록 자체가 아니라 목록을 포함하는 일부 개체(클래스 인스턴스)를 비교하려고 합니다.
목록 필드가 있는 클래스를 만들 수 있습니다.
class A {
final String name;
final List<int> list;
A(this.name, this.list);
}
그리고 그것의 인스턴스를 비교하고 싶다면, 당신은 동등한 패키지를 사용할 수 있습니다.
class A extends Equatable {
final String name;
final List<int> list;
A(this.name, this.list);
@override
List<Object> get props => [name, list];
}
그런 다음 사용하여 객체를 단순하게 비교합니다.==
final x = A('foo', [1,2,3]);
final y = A('foo', [1,2,3]);
print(x == y); // true
가장 편리한 옵션은 다음에서 확장 메서드를 만드는 것입니다.List
학생들
extension on List {
bool equals(List list) {
if(this.length!=list.length) return false;
return this.every((item) => list.contains(item));
}
}
위의 코드가 하는 일은 모든 코드를 확인하는 것입니다.item
번째에서 (첫번째목서에록▁(서에▁from▁the (this
는 두 목록되어 있습니다.list
하지만 두 목록의 길이가 같은 경우에만 작동합니다.물론 다른 솔루션 중 하나로 대체하거나 이 솔루션을 수정할 수 있습니다. 편의를 위해 이를 보여드리는 것입니다.이 확장명을 사용하려면 다음 작업을 수행합니다.
List list1, list2
list1.equals(list2);
작동하기 전에 다음을 사용할 수 있습니다.
/**
* Returns true if the two given lists are equal.
*/
bool _listsAreEqual(List one, List two) {
var i = -1;
return one.every((element) {
i++;
return two[i] == element;
});
}
이와 같은 것이 당신에게 효과가 있습니까?
try {
Expect.listEquals(list1, list2);
} catch (var e) {
print("lists aren't equal: $e");
}
예:
main() {
List<int> list1 = [1, 2, 3, 4, 5];
List<int> list2 = new List.from(list1);
try {
Expect.listEquals(list1, list2);
} catch (var e) {
print("lists aren't equal: $e");
}
list1.removeLast();
try {
Expect.listEquals(list1, list2);
} catch (var e) {
print("Lists aren't equal: $e");
}
}
두 번째 시도 인쇄:
Lists aren't equal: Expect.listEquals(list length, expected: <4>, actual: <5>) fails
bool areListsEqual(var list1, var list2) {
// check if both are lists
if(!(list1 is List && list2 is List)
// check if both have same length
|| list1.length!=list2.length) {
return false;
}
// check if elements are equal
for(int i=0;i<list1.length;i++) {
if(list1[i]!=list2[i]) {
return false;
}
}
return true;
}
다트에서 두 int 목록의 동일성을 비교하는 간단한 해결책은 join()을 사용하여 문자열로 비교하는 것입니다.
var a = [1,2,3,0];
var b = [1,2,3,4];
a.join('') == b.join('') ? return true: return false;
언급URL : https://stackoverflow.com/questions/10404516/how-can-i-compare-lists-for-equality-in-dart
'programing' 카테고리의 다른 글
명령줄(단말기)에서 R 스크립트를 사용하는 가장 좋은 방법은 무엇입니까? (0) | 2023.05.08 |
---|---|
C#의 문자열에서 마지막 4자를 가져오려면 어떻게 해야 합니까? (0) | 2023.05.03 |
"앱스토어 연결 작업 오류 ITMS-90771" 수정 방법 (0) | 2023.05.03 |
Azure 함수에 대한 다중 트리거 (0) | 2023.05.03 |
Python 3 open(python="utf-8")을 Python 2로 백포팅합니다. (0) | 2023.05.03 |