2012-10-15 60 views

Trả lời

12

Cảm ơn câu hỏi! Bạn có thể sắp xếp một danh sách các Strings như thế này:

main() { 
    var fruits = ['bananas', 'apples', 'oranges']; 
    fruits.sort(); 
    print(fruits); 
} 

Các bản in mã trên:

apples, bananas, oranges 

ý rằng sort() không trả lại một giá trị. Nó sắp xếp danh sách mà không cần tạo danh sách mới. Nếu bạn muốn sắp xếp và in trong cùng một dòng, bạn có thể sử dụng phương pháp thác:

print(fruits..sort()); 

Để kiểm soát hơn, bạn có thể xác định logic so sánh của riêng bạn. Dưới đây là một ví dụ về phân loại các loại trái cây dựa trên giá.

main() { 
    var fruits = ['bananas', 'apples', 'oranges']; 
    fruits.sort((a, b) => getPrice(a).compareTo(getPrice(b))); 
    print(fruits); 
} 

Hãy xem những gì đang diễn ra ở đây.

Danh sách có phương thức sort, có một tham số tùy chọn: a Comparator. Công cụ so sánh là một typedef hoặc bí danh chức năng. Trong trường hợp này, nó là một bí danh cho một chức năng giống như:

int Comparator(T a, T b) 

Từ các tài liệu:

Một chức năng Comparator đại diện cho một tổng trật tự như vậy bằng cách trả lại một số nguyên âm nếu a là nhỏ hơn b, số không nếu a bằng b và số nguyên dương nếu a lớn hơn b.

+0

Cảm ơn! Xin lỗi để phàn nàn nhưng trong khi tôi đang cố gắng để đánh giá cao tính linh hoạt rõ ràng của các bên trên, tôi không tìm thấy nó trực quan hoặc nội tuyến với kinh nghiệm ngôn ngữ trước đó. Các bạn có ai đó với một con chuột bằng gỗ vuông và một bộ râu màu xám dài sắp tới với một số thứ này không? :) –

+1

Đây là một hiện vật lịch sử kỳ lạ. Bộ so sánh phải là tùy chọn. Nó được sử dụng để được, nhưng chúng tôi đã thay đổi cú pháp tham số tùy chọn một lúc trở lại, buộc chúng tôi phải thực hiện tất cả các thông số không tùy chọn trong một thời gian, bao gồm cả thông số này. Chúng tôi chưa có cơ hội sửa lỗi này và làm cho nó trở lại tùy chọn. – munificent

+0

Cảm ơn @munificent rất vui khi biết rằng nó sẽ sớm được khắc phục. Xem lỗi http://code.google.com/p/dart/issues/detail?id=1235 –

2

Để thêm chỉ là một điểm đến câu trả lời chi tiết của Seth, nói chung, trong

(a, b) => foo(a, b) 

truyền vào sort, hàm foo nên trả lời một kết quả số nguyên như sau:

  • nếu một < b, kết quả phải là < 0,
  • nếu a = b, kết quả phải là = 0 và
  • nếu a> b, kết quả nên> 0.

Đối với pháp luật nêu trên chia làm ba phần để tổ chức, cả ab phải Comparable s.

0

Sau ngày hôm nay, bạn chỉ có thể thực hiện list.sort(). Đối số của phương thức sắp xếp giờ đây là tùy chọn và mặc định là một hàm gọi compareTo trên chính các phần tử đó. Vì String có thể so sánh, nên nó chỉ hoạt động ngay bây giờ.

+0

Phương thức sắp xếp Danh sách() có bao giờ được cố định để không yêu cầu một hàm so sánh không? Hay là có hồi quy? Tôi đang sử dụng Dart 0.2.6.0_r15355 trên Ubuntu 12.04 và nhận được các kết quả sau: [3,1,2] .sort() == null và ['a', 'c', 'b']. Sort () == null. – devdanke

+0

Rất tiếc! Dart đã sắp xếp mảng :-) Nhưng hàm sort() trả về void :-(Vì vậy, "print ([3,1,2] .sort()) '" output "null". Trong trường hợp này, các devs Dart là Tôi không muốn họ thực hiện một cách thông thạo, bởi vì sau đó bạn có thể sử dụng kết quả của việc gọi sort() ngay lập tức. – devdanke

2

Phân loại lười biếng. Kết quả là IQueryable.

Bộ so sánh tùy chỉnh có thể được chuyển làm đối số.

import 'package:queries/collections.dart'; 

void main() { 
    var fruits = ["grape", "passionfruit", "banana", "mango", 
       "orange", "raspberry", "apple", "blueberry"]; 

    var sorted = new Collection(fruits) 
    .orderBy((fruit) => fruit.length) 
    .thenBy((fruit) => fruit); 

    for(var fruit in sorted) { 
    print(fruit); 
    } 
} 

Output:

mango 
banana 
orange 
blueberry 
raspberry 
passionfruit 
Các vấn đề liên quan