Reputation: 2133
I want to sort a list based on a boolean using Comparable
in dart
. I tried the following but was not able to do it.
In the list, all the elements which are true
should come first rest of the list should remain as it is.
class Item implements Comparable<Item> {
int id;
String name;
int price;
bool isAvailable;
Item({this.id, this.name, this.price, this.isAvailable = false});
@override
int compareTo(Item other) {
if (isAvailable) {
return -1;
}
return 0;
}
}
void main() {
Item item = new Item(id: 1, name: "Item one", price: 1000);
Item item2 = new Item(id: 2, name: "Item two", price: 2000);
Item item3 =
new Item(id: 3, name: "Item three", price: 500, isAvailable: true);
List<Item> items = [item, item2, item3];
items.sort();
items.forEach((Item item) {
print('${item.id} - ${item.name} - ${item.price}');
});
}
This should print
3 - Item three - 500
1 - Item one - 1000
2 - Item two - 2000
3 - Item three - 500
should come first because it is true
but it is printing
1 - Item one - 1000
2 - Item two - 2000
3 - Item three - 500
What am I doing wrong?
This code can be run as it is on Dartpad here
Upvotes: 6
Views: 1554
Reputation: 90055
A compareTo
implementation should be reflexive, anti-symmetric, and transitive. Violating these properties can give sort results that are not self-consistent.
As written, your compareTo
claims that two elements are always considered "equal" in sort order if this.isAvailable
is false. But what about if other.isAvailable
is true?
Your sort should work if you implement compareTo
properly without trying to take shortcuts:
int compareTo(Item other) {
if (isAvailable == other.isAvailable) {
return 0;
} else if (isAvailable) {
return -1;
}
return 1;
}
Upvotes: 13