使用Flutter / Dart(新手)。我需要将用户结果存储在游戏中(分数,时间和名称)。我认为GameResult类是路要走吗?
然后,我需要按日期/时间(最新到最旧)对每个用户进行排序,以显示结果表。如何订购日期时间值?
答案 0 :(得分:5)
Dart DateTime类是Comparable到其他DateTime
对象的对象,因此您可以使用dateTime1.compareTo(dateTime2)
比较两个时间点。
示例:
class Result implements Comparable<Result> {
final String name;
final int score;
final DateTime time;
Result(this.name, this.score, this.time);
int compareTo(Result other) {
int order = other.score.compareTo(score);
if (order == 0) order = time.compareTo(other.time);
return order;
}
String toString() => "Result($name, score: $score, time: $time)";
}
这将创建一个可以将实例相互比较的类。
顺序首先是倒退score
(高分先于低分),对于等分,则将先后的结果排序在先后的结果。
如果接收方的顺序在参数“之前”,则指定Comparable.compareTo
方法以返回负数;如果接收方的顺序相同,则返回0;如果接收方在参数之后,则返回正数。
整数也具有可比性,通过使用other.score.compareTo(score)
而不是其他方法,我们有效地切换了得分的顺序-整数默认为在较高值之前较低的值)。
当Result
类与其自身具有可比性时,您可以将List<Result>
排序为:
var results = <Result>[
Result("Me", 0, DateTime.now().subtract(Duration(hours: 1))),
Result("Me again", 0, DateTime.now().subtract(Duration(hours: 2))),
Result("You", 1000000, DateTime.now().subtract(Duration(hours: 24))),
];
results.sort();
print(results.join("\n"));
此打印:
Result(You, score: 1000000, time: 2018-10-23 15:34:16.532)
Result(Me again, score: 0, time: 2018-10-24 13:34:16.532)
Result(Me, score: 0, time: 2018-10-24 14:34:16.531)
您以得分获胜。我以前的零得分早于我后面的零得分。
答案 1 :(得分:0)
import 'package:queries/collections.dart';
import 'package:queries/queries.dart';
void main() {
var c = Collection(results());
// <========
var q = c.orderBy((e) => e.time);
// ========>
print(q.toList());
}
List<Result> results() {
return Enumerable.range(0, 3)
.select$1((e, i) => Result(
name: 'Result $i',
score: i * 10,
time: DateTime.now().subtract(Duration(hours: 1 * i))))
.toList();
}
class Result {
String name;
int score;
DateTime time;
Result({this.name, this.score, this.time});
String toString() {
return '{$name, $score, $time}';
}
}
结果:
{Result 2, 20, 2019-03-03 22:16:12.353493},
{Result 1, 10, 2019-03-03 23:16:12.353493},
{Result 0, 0, 2019-03-04 00:16:12.353493}
答案 2 :(得分:0)
一种方法是将日期评估为 Epoch DateTime millisecondsSinceEpoch
,然后将其排序为标准的 int 值。
通过这种方法,您可以将整个列表排成一行 ...
result.sort((a,b) => a.date.millisecondsSinceEpoch.compareTo(b.date.millisecondsSinceEpoch));
这是使用“游戏结果”场景的完整示例
// Create the game result object
class Result{
Result(this.name, this.score, this.date);
String name;
int score;
DateTime date;
@override
String toString() => '$name $score $date';
}
// Create a list to put the results in
List<Result> result = [];
// Populate the list with results
result..add( Result('Tom', 850, DateTime.tryParse('2020-01-10')))
..add( Result('Dic', 600, DateTime.tryParse('2020-01-03')))
..add( Result('Harry', 450, DateTime.tryParse('2020-01-05')));
// print the unsorted list
print(result);
// Sort the list by datetime property
result.sort((a,b) => a.date.millisecondsSinceEpoch.compareTo(b.date.millisecondsSinceEpoch));
// print the sorted list
print(result);