How to delete duplicates in a dart List? list.distinct()?

后端 未结 11 2114
夕颜
夕颜 2020-12-01 05:21

How do i delete duplicates from a list without fooling around with a set? Is there something like list.distinct()? or list.unique()?

void main() {
  print(\"         


        
11条回答
  •  Happy的楠姐
    2020-12-01 05:30

    As for me one of best practices is sort array, then deduplicate it. Idea is stolen from low level languages. So,

    first make sort by your own, then deduplicate equal values that are going after each other.

    // easy example
    void dedup(List list, {removeLast: true}) {
      int shift = removeLast ? 1 : 0;
      T compareItem;
      for (int i = list.length - 1; i >= 0; i--) {
        if (compareItem == (compareItem = list[i])) {
          list.removeAt(i + shift);
        }
      }
    }
    
    // harder example
    void dedupBy(List list, I Function(T) compare, {removeLast: true}) {
      int shift = removeLast ? 1 : 0;
      I compareItem;
      for (int i = list.length - 1; i >= 0; i--) {
        if (compareItem == (compareItem = compare(list[i]))) {
          list.removeAt(i + shift);
        }
      }
    }
    
    
    void main() {
      List> list = [[1], [1], [2, 1], [2, 2]];
      print('$list');
      dedupBy(list, (innerList) => innerList[0]);
      print('$list');
    
      print('\n removeLast: false');
    
      List> list2 = [[1], [1], [2, 1], [2, 2]];
      print('$list2');
      dedupBy(list2, (innerList) => innerList[0], removeLast: false);
      print('$list2');
    }
    

    Output:

    [[1], [1], [2, 1], [2, 2]]
    [[1], [2, 1]]
    
    removeLast: false
    [[1], [1], [2, 1], [2, 2]]
    [[1], [2, 2]]
    

提交回复
热议问题