programing

다트의 평등에 대한 목록을 어떻게 비교할 수 있습니까?

powerit 2023. 5. 3. 22:01
반응형

다트의 평등에 대한 목록을 어떻게 비교할 수 있습니까?

다트에 있는 두 개의 목록을 이렇게 비교하고 있습니다.

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용 불변 컬렉션을 제공합니다.

만약 여러분이 평등을 요구하는 어떤 일을 하고 있다면, 여러분은 불변성을 가진 더 나은 삶을 살 가능성도 있습니다.

http://www.dartdocs.org/documentation/built_collection/0.3.1/index.html#built_collection/built_collection

때때로 목록 자체가 아니라 목록을 포함하는 일부 개체(클래스 인스턴스)를 비교하려고 합니다.

목록 필드가 있는 클래스를 만들 수 있습니다.

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

반응형