簡體   English   中英

從給定的兩個列表中,如何從一個列表中提取 Dart 中另一個列表中不可用的所有元素?

[英]From given two lists, how to extract all the elements from one list that are not available in the other list in Dart?

我在 Dart 中有兩個列表,如下所示,

  final List availableIssueComponents = [
    {'id': 1, 'componentName': 'Cash Acceptor'},
    {'id': 2, 'componentName': 'Printer'},
    {'id': 3, 'componentName': 'PIN Pad'},
    {'id': 4, 'componentName': 'Key Board'},
    {'id': 5, 'componentName': 'Touch Screen'},
    {'id': 6, 'componentName': 'Computer'},
    {'id': 7, 'componentName': 'Application'},
    {'id': 8, 'componentName': 'Network'},
    {'id': 9, 'componentName': 'Power'},
    {'id': 10, 'componentName': 'Camera'},
    {'id': 11, 'componentName': 'Safe'},
    {'id': 13, 'componentName': 'Screen'},
    {'id': 14, 'componentName': 'Battery'},
    {'id': 15, 'componentName': 'Ports'},
    {'id': 16, 'componentName': 'Application'},
    {'id': 17, 'componentName': 'Safe'},
    {'id': 18, 'componentName': 'Camera'},
    {'id': 19, 'componentName': 'Power'},
    {'id': 20, 'componentName': 'Key Board'},
    {'id': 21, 'componentName': 'PIN Pad'},
    {'id': 22, 'componentName': 'Printer'},
    {'id': 23, 'componentName': 'Computer'},
    {'id': 24, 'componentName': 'Touch Screen'},
    {'id': 25, 'componentName': 'Application'},
    {'id': 26, 'componentName': 'Network'}
  ];

  final List selectedIssueComponents = [
    {'id': 3, 'componentName': 'PIN Pad'},
    {'id': 6, 'componentName': 'Computer'},
    {'id': 19, 'componentName': 'Power'},
  ];

從上面的兩個列表中,我正在嘗試 select availableIssueComponents中的所有元素,不包括selectedIssueComponents中已經可用的元素。

例如:由於 id 為3619的組件在兩個列表中都很常見,因此我想要第三個列表,其中包含所有組件,不包括 id 為3619的組件。

第三個列表應該如下所示,

  final List availableIssueComponents = [
    {'id': 1, 'componentName': 'Cash Acceptor'},
    {'id': 2, 'componentName': 'Printer'},
    {'id': 4, 'componentName': 'Key Board'},
    {'id': 5, 'componentName': 'Touch Screen'},
    {'id': 7, 'componentName': 'Application'},
    {'id': 8, 'componentName': 'Network'},
    {'id': 9, 'componentName': 'Power'},
    {'id': 10, 'componentName': 'Camera'},
    {'id': 11, 'componentName': 'Safe'},
    {'id': 13, 'componentName': 'Screen'},
    {'id': 14, 'componentName': 'Battery'},
    {'id': 15, 'componentName': 'Ports'},
    {'id': 16, 'componentName': 'Application'},
    {'id': 17, 'componentName': 'Safe'},
    {'id': 18, 'componentName': 'Camera'},
    {'id': 20, 'componentName': 'Key Board'},
    {'id': 21, 'componentName': 'PIN Pad'},
    {'id': 22, 'componentName': 'Printer'},
    {'id': 23, 'componentName': 'Computer'},
    {'id': 24, 'componentName': 'Touch Screen'},
    {'id': 25, 'componentName': 'Application'},
    {'id': 26, 'componentName': 'Network'}
  ];

我嘗試使用 Sets 來做到這一點,以下是我的方法,

Set availableComponentsSet = Set.from(availableIssueComponents);
Set issueComponentsSet = Set.from(selectedIssueComponents);

Set resultComponents = availableComponentsSet.difference(issueComponentsSet);

但是當登錄到控制台時, resultComponents包含所有組件。 這不是我想要的。 我還嘗試了嵌套的 for 循環,但它也沒有用。

使用Set<Map>時,組件對象不會被Set過濾,因為Map是引用類型並且被認為是唯一的,除非被比較的兩個對象指向同一實例(如@Pat9RB 所評論的)。

我會將 map 選定的 ID 添加到列表中,然后使用List#where(fn)過濾掉這些 ID

final availableIssueComponents = [
  {'id': 1, 'componentName': 'Cash Acceptor'},
  {'id': 2, 'componentName': 'Printer'},
  {'id': 3, 'componentName': 'PIN Pad'},
  {'id': 4, 'componentName': 'Key Board'},
  {'id': 5, 'componentName': 'Touch Screen'},
  {'id': 6, 'componentName': 'Computer'},
  {'id': 7, 'componentName': 'Application'},
  {'id': 8, 'componentName': 'Network'},
  {'id': 9, 'componentName': 'Power'},
  {'id': 10, 'componentName': 'Camera'},
  {'id': 11, 'componentName': 'Safe'},
  {'id': 13, 'componentName': 'Screen'},
  {'id': 14, 'componentName': 'Battery'},
  {'id': 15, 'componentName': 'Ports'},
  {'id': 16, 'componentName': 'Application'},
  {'id': 17, 'componentName': 'Safe'},
  {'id': 18, 'componentName': 'Camera'},
  {'id': 19, 'componentName': 'Power'},
  {'id': 20, 'componentName': 'Key Board'},
  {'id': 21, 'componentName': 'PIN Pad'},
  {'id': 22, 'componentName': 'Printer'},
  {'id': 23, 'componentName': 'Computer'},
  {'id': 24, 'componentName': 'Touch Screen'},
  {'id': 25, 'componentName': 'Application'},
  {'id': 26, 'componentName': 'Network'}
];

final selectedIssueComponents = [
  {'id': 3, 'componentName': 'PIN Pad'},
  {'id': 6, 'componentName': 'Computer'},
  {'id': 19, 'componentName': 'Power'},
];

final selectedIds = selectedIssueComponents.map((component) => component['id']).toList();
final filtered = availableIssueComponents.where((element) => !selectedIds.contains(element["id"])).toList();

print(filtered);

如果您更喜歡使用Setdifference ,您可以創建 id 集。 這將創建一組int ( Set<int> ),它是原始類型,並允許預期的過濾類型:

final availableIssueComponents = [
  {'id': 1, 'componentName': 'Cash Acceptor'},
  {'id': 2, 'componentName': 'Printer'},
  {'id': 3, 'componentName': 'PIN Pad'},
  {'id': 4, 'componentName': 'Key Board'},
  {'id': 5, 'componentName': 'Touch Screen'},
  {'id': 6, 'componentName': 'Computer'},
  {'id': 7, 'componentName': 'Application'},
  {'id': 8, 'componentName': 'Network'},
  {'id': 9, 'componentName': 'Power'},
  {'id': 10, 'componentName': 'Camera'},
  {'id': 11, 'componentName': 'Safe'},
  {'id': 13, 'componentName': 'Screen'},
  {'id': 14, 'componentName': 'Battery'},
  {'id': 15, 'componentName': 'Ports'},
  {'id': 16, 'componentName': 'Application'},
  {'id': 17, 'componentName': 'Safe'},
  {'id': 18, 'componentName': 'Camera'},
  {'id': 19, 'componentName': 'Power'},
  {'id': 20, 'componentName': 'Key Board'},
  {'id': 21, 'componentName': 'PIN Pad'},
  {'id': 22, 'componentName': 'Printer'},
  {'id': 23, 'componentName': 'Computer'},
  {'id': 24, 'componentName': 'Touch Screen'},
  {'id': 25, 'componentName': 'Application'},
  {'id': 26, 'componentName': 'Network'}
];

final selectedIssueComponents = [
  {'id': 3, 'componentName': 'PIN Pad'},
  {'id': 6, 'componentName': 'Computer'},
  {'id': 19, 'componentName': 'Power'},
];
final availableIds = availableIssueComponents.map((component) => component['id']).toSet();
final selectedIds = selectedIssueComponents.map((component) => component['id']).toSet();
final filteredIds = availableIds.difference(selectedIds);
final filteredComponents = availableIssueComponents.where((element) => filteredIds.contains(element["id"])).toList();

print(filteredComponents);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM