簡體   English   中英

在 Dart 中對對象列表進行排序

[英]Sort a list of objects in Dart

我正在嘗試使用以下函數對名為“posts”的對象列表進行排序。 它似乎沒有按我預期的那樣工作,我不知道為什么。 在調用函數之前,“帖子”中的標題值是 66666666666,新的,Luke Kady,Rory 的溜冰場,新的帖子。 按標題排序后:66666666666,Luke Kady,新的,新的帖子,Rory 的溜冰場。 還嘗試為標題添加.toLowerCaase()並得到相同的結果。

void sortPosts(String sortBy) {
   if (sortBy == "Title") {
      posts.sort((a, b) => a.title[0].compareTo(b.title[0]));
   } else {
      posts.sort((a, b) => a.price.compareTo(b.price));
   }
}

您可以手動檢查compareTo值並決定要做什么。

在下面的示例中,我們使用反射(鏡像),因此我們可以指定一個屬性(不需要反射,也可以避免反射)。

以下代碼可幫助您入門:

class Post {
  String title;
  String author;

  Post({this.title = "N/A", this.author = "N/A"});

  // partially applicable sorter
  static Function(Post, Post) sorter(int sortOrder, String property) {
     int handleSortOrder(int sortOrder, int sort) {
       if (sortOrder == 1) {
         // a is before b
         if (sort == -1) {
           return -1;
         } else if (sort > 0) {
           // a is after b
           return 1;
         } else {
           // a is same as b
           return 0;
         }
       } else {
         // a is before b
         if (sort == -1) {
           return 1;
         } else if (sort > 0) {
           // a is after b
           return 0;
         } else {
           // a is same as b
           return 0;
         }
       }
     }

     return (Post a, Post b) {
      switch (property) {
        case "title":
            int sort = a.title.compareTo(b.title);
            return handleSortOrder(sortOrder, sort);
        case "author":
            int sort = a.author.compareTo(b.author);
            return handleSortOrder(sortOrder, sort);
        default:
            break;
      }
    };
  }

  // sortOrder = 1 ascending | 0 descending
  static void sortPosts(List<Post> posts, {int sortOrder = 1, String property = "title"}) {
    switch (property) {
      case "title":
        posts.sort(sorter(sortOrder, property));
        break;
      case "author":
        posts.sort(sorter(sortOrder, property));
        break;
      default:
        print("Unrecognized property $property");
    }
  }
}

void main() {
  List<Post> posts = [
    new Post(title: "bart loves ice cream", author: "bart"),
    new Post(title: "alex loves ice cream", author: "alex"),
    new Post(title: "carl loves ice cream", author: "carl")
  ];

  print("---Sorted by title Ascending(default) order---");
  Post.sortPosts(posts);
  posts.forEach((p) => print(p.title));

  print("---Sorted by title Descending order----");
  Post.sortPosts(posts, sortOrder: 0);
  posts.forEach((p) => print(p.title));

  print("---Sorted by author Ascending order---");
  Post.sortPosts(posts, property: "author");
  posts.forEach((p) => print(p.author));
}

輸出:

---Sorted by title Ascending(default) order---
alex loves ice cream
bart loves ice cream
carl loves ice cream
---Sorted by title Descending order----
carl loves ice cream
bart loves ice cream
alex loves ice cream
---Sorted by author Ascending order---
alex
bart
carl

替代方式:

import 'package:queries/collections.dart';

void main() {
  var posts = getPosts();
  var sortBy = 'author';
  var sorted = sortPosts(posts, sortBy);
  print('Ascending by ${sortBy}');
  print(sorted);
  //
  sortBy = 'title';
  print('Descending by ${sortBy}');
  sorted = sortPosts(posts, sortBy, false);
  print(sorted);
}

List<Post> sortPosts(List<Post> posts, String sortBy, [bool asc = true]) {
  var keySelector;
  switch (sortBy.toLowerCase()) {
    case 'author':
      keySelector = (Post p) => p.author;
      break;
    case 'title':
      keySelector = (Post p) => p.title;
      break;
    default:
      throw ArgumentError(sortBy);
  }

  if (asc) {
    return Collection(posts).orderBy<String>(keySelector).toList();
  } else {
    return Collection(posts).orderByDescending<String>(keySelector).toList();
  }
}

List<Post> getPosts() {
  var result = <Post>[];
  for (var i = 0; i < 3; i++) {
    var post = Post('Author ${i}', ' Title ${i}');
    result.add(post);
  }

  return result;
}

class Post {
  String author;
  String title;
  Post(this.author, this.title);

  String toString() {
    return '${author}: ${title}';
  }
}

結果:

Ascending by author [Author 0: Title 0, Author 1: Title 1, Author 2: Title 2] Descending by title [Author 2: Title 2, Author 1: Title 1, Author 0: Title 0]

暫無
暫無

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

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