Urutkan scala arrayBuffer dari TimeStamp

Saya memiliki fungsi ini:

def getTime() : ArrayBuffer[Timestamp] = {
    val offset = Timestamp.valueOf("2015-01-01 00:00:00").getTime()
    val end = Timestamp.valueOf("2015-01-02 00:00:00").getTime()
    val diff = end - offset + 1

    val mList = ArrayBuffer[Timestamp]()

    val numRecords = 3
    var i = 0
    while (i < numRecords) {
      val rand = new Timestamp(offset + (Math.random() * diff).toLong)

      mList += rand
      i += 1
    }

  //  mList.toList.sortWith(_ < _); 
   // scala.util.Sorting.quickSort(mList.toArray);
}

Saya telah mencoba mengurutkan array tetapi tidak bisa. Saya mendapatkan kesalahan ini:

No implicit Ordering defined for java.sql.Timestamp.

Saya tahu saya perlu menjelaskan bagaimana pemesanan akan dilakukan. Apakah ada cara untuk mengurutkannya dengan mudah seperti di Java: Collections.sort(list); atau ada pendekatan yang lebih baik menggunakan Scala?


person aselims    schedule 01.05.2015    source sumber


Jawaban (2)


Alternatifnya, tentukan di suatu tempat di kelas Anda dan Anda siap melakukannya:

implicit def ordered: Ordering[Timestamp] = new Ordering[Timestamp] {
    def compare(x: Timestamp, y: Timestamp): Int = x compareTo y
}
getTime().sorted // now this will work just fine
person om-nom-nom    schedule 01.05.2015
comment
Terima kasih Om, saya ingin tahu bagaimana kesenangan tersirat dihubungkan dengan pengurutan? Konsep di baliknya? - person aselims; 01.05.2015
comment
@aselims oh, maaf meninggalkannya dalam kabut. Jika Anda melihat bagaimana pengurutan didefinisikan, Anda akan melihat bahwa hal itu secara implisit memerlukan satu argumen -- pengurutan, yang harus didefinisikan di suatu tempat dalam cakupan. Untuk banyak tipe data sudah ada definisi seperti itu, yang disediakan oleh scala sehingga Anda tidak perlu melakukan pekerjaan ekstra agar dapat berfungsi, namun beberapa jenis masih mengharuskan Anda melakukan pengkabelan manual. Di sini, saya mendefinisikan Pengurutan untuk Stempel Waktu, memanfaatkan fakta bahwa Stempel Waktu sebenarnya Sebanding. - person om-nom-nom; 02.05.2015
comment
Perhatikan juga, bahwa def ordered ....; getTime().sorted(ordered) juga akan berfungsi, saya cukup menambahkan sedikit keajaiban. - person om-nom-nom; 02.05.2015
comment
Terima kasih @Om, maukah Anda memberi saya referensi singkat sehingga saya bisa mendapatkan rahasia scala seperti itu? - person aselims; 05.05.2015
comment
@aselims tidak terlalu singkat, tetapi Pemrograman Scala kanonik adalah hal yang nyata - person om-nom-nom; 05.05.2015

mList.sortWith(_.compareTo(_) < 1)

Perhatikan bahwa dengan fungsi anonim, Anda dapat meneruskan fungsi eksplisit, yang akan terlihat seperti ini:

def comparator(first: Timestamp, second: Timestamp) = first.compareTo(second) < 1

mList.sortWith(comparator)

Tidak ada pengurutan implisit pada Timestamp itu sendiri, di sini kami hanya mengurutkan menggunakan metode compareTo.

Terima kasih kepada @Nick karena telah menunjukkan bahwa penyortiran pada getTime() tidak cukup di semua skenario. Saya juga melihat metode before yang Anda harapkan berfungsi, tetapi ini hanya membandingkan penggunaan nilai Epoch juga.

person Sebastiaan van den Broek    schedule 01.05.2015
comment
java.sql.Timestamp dapat mewakili waktu hingga nanodetik tetapi Timestamp.getTime memiliki resolusi milidetik, yang menyebabkan kesalahan pengurutan Stempel Waktu yang berjarak kurang dari 1 md, yang biasa terjadi jika stempel waktu Anda berasal dari Postgres, dll. - person Nick; 05.02.2019
comment
@Nick poin bagus, meskipun Postgres saat ini hanya mendukung presisi mikrodetik (postgresql.org/docs /current/datatype-datetime.html) seperti kebanyakan database. Namun akan tetap lebih rapi jika penataannya benar dalam setiap hal. Saya akan melihat apakah saya bisa menjadikannya jawabannya. - person Sebastiaan van den Broek; 05.02.2019
comment
Ya! Resolusi apa pun yang kurang dari milidetik akan memicunya dalam pendekatan getTime, karena mikrodetik dll setelah milidetik semuanya disimpan dalam komponen nanos. (Ini baru-baru ini mengganggu saya dalam beberapa pengujian otomatis). Terpilih untuk pembaruan :) - person Nick; 05.02.2019
comment
@Nick oh benar, saya hanya bingung antara mikro dan mili di sana ???? bagaimanapun juga, ada baiknya untuk menghindari masalah. Kelas yang agak rumit. - person Sebastiaan van den Broek; 05.02.2019