Dart-如何订购日期时间对象?

时间:2018-10-24 11:09:01

标签: dart flutter

使用Flutter / Dart(新手)。我需要将用户结果存储在游戏中(分数,时间和名称)。我认为GameResult类是路要走吗?

然后,我需要按日期/时间(最新到最旧)对每个用户进行排序,以显示结果表。如何订购日期时间值?

3 个答案:

答案 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);