เรียงลำดับสกาลา arrayBuffer ของ TimeStamp

ฉันมีฟังก์ชั่นนี้:

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);
}

ฉันพยายามเรียงลำดับอาร์เรย์แต่ทำไม่ได้ ฉันได้รับข้อผิดพลาดนี้:

No implicit Ordering defined for java.sql.Timestamp.

ฉันรู้ว่าฉันต้องกำหนดวิธีการสั่งซื้อ มีวิธีจัดเรียงอย่างง่ายดายเหมือนใน Java: Collections.sort(list); หรือมีแนวทางที่ดีกว่าในการใช้ Scala?


person aselims    schedule 01.05.2015    source แหล่งที่มา


คำตอบ (2)


หรือกำหนดไว้ที่ไหนสักแห่งในชั้นเรียนของคุณ เท่านี้คุณก็พร้อมแล้ว:

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
ขอบคุณออม ฉันอยากทราบว่าความสนุกโดยปริยายเชื่อมโยงกับการเรียงลำดับอย่างไร แนวคิดเบื้องหลัง? - person aselims; 01.05.2015
comment
@aselims โอ้ขอโทษที่ทิ้งมันไว้ในสายหมอก หากคุณดูว่าการเรียงลำดับถูกกำหนดอย่างไร คุณจะเห็นว่าการเรียงลำดับนั้นจำเป็นต้องมีอาร์กิวเมนต์เดียวโดยปริยาย นั่นคือการเรียงลำดับ ซึ่งจะต้องกำหนดไว้ที่ไหนสักแห่งในขอบเขต สำหรับประเภทข้อมูลหลายประเภท มีคำจำกัดความดังกล่าวอยู่แล้ว ซึ่งจัดทำโดย scala ดังนั้นคุณจึงไม่ต้องทำงานพิเศษเพื่อที่จะทำงาน แต่บางประเภทก็ยังกำหนดให้คุณต้องเดินสายด้วยตนเอง ที่นี่ ฉันกำหนดลำดับสำหรับการประทับเวลาดังกล่าว โดยใช้ประโยชน์จากข้อเท็จจริงที่ว่าการประทับเวลานั้นเทียบเคียงได้จริง - person om-nom-nom; 02.05.2015
comment
โปรดทราบว่า def ordered ....; getTime().sorted(ordered) ก็ใช้ได้เช่นกัน ฉันแค่เพิ่มความมหัศจรรย์เล็กน้อย - person om-nom-nom; 02.05.2015
comment
ขอบคุณ @Om คุณช่วยให้ข้อมูลอ้างอิงสั้น ๆ แก่ฉันว่าฉันสามารถรับความลับของสกาล่าได้ไหม - person aselims; 05.05.2015
comment
@aselims ไม่ค่อนข้างสั้น แต่ Canonical Programming Scala เป็นเรื่องจริง - person om-nom-nom; 05.05.2015

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

โปรดทราบว่าเมื่อใช้ฟังก์ชันที่ไม่ระบุชื่อ คุณสามารถส่งผ่านฟังก์ชันที่ชัดเจนได้ ซึ่งจะมีลักษณะดังนี้:

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

mList.sortWith(comparator)

ไม่มีการเรียงลำดับโดยนัยในการประทับเวลา ในกรณีนี้ เราเพียงจัดเรียงโดยใช้เมธอด compareTo

ขอบคุณ @Nick ที่ชี้ให้เห็นว่าการเรียงลำดับใน getTime() นั้นไม่เพียงพอในทุกสถานการณ์ ฉันยังได้ดูวิธีการ before ที่คุณคาดว่าจะใช้งานได้ แต่จะเปรียบเทียบเฉพาะการใช้ค่ายุคเท่านั้น

person Sebastiaan van den Broek    schedule 01.05.2015
comment
java.sql.Timestamp สามารถแสดงเวลาได้ถึงระดับนาโนวินาที แต่ Timestamp.getTime มีความละเอียดเป็นมิลลิวินาที ซึ่งนำไปสู่การเรียงลำดับการประทับเวลาไม่ถูกต้องซึ่งห่างกันน้อยกว่า 1 มิลลิวินาที ซึ่งไม่ใช่เรื่องแปลกมากนักหากการประทับเวลาของคุณมาจาก Postgres เป็นต้น - person Nick; 05.02.2019
comment
@Nick จุดดีแม้ว่า Postgres รองรับเฉพาะความแม่นยำระดับไมโครวินาทีในปัจจุบัน (postgresql.org/docs /current/datatype-datetime.html) เช่นเดียวกับฐานข้อมูลส่วนใหญ่ แต่จะดีกว่านี้ถ้าสั่งถูกต้องทุกกรณี ฉันจะดูว่าฉันสามารถตอบคำถามนั้นได้หรือไม่ - person Sebastiaan van den Broek; 05.02.2019
comment
ใช่! อะไรก็ตามที่ความละเอียดน้อยกว่ามิลลิวินาทีจะทริกเกอร์ในแนวทาง getTime เนื่องจากไมโครวินาที ฯลฯ ที่เกินมิลลิวินาทีทั้งหมดจะถูกจัดเก็บไว้ในส่วนประกอบนาโน (เมื่อเร็ว ๆ นี้สิ่งนี้ทำให้ฉันเจ็บก้นในการทดสอบอัตโนมัติบางรายการ) โหวตขึ้นสำหรับการอัปเดต :) - person Nick; 05.02.2019
comment
@นิค โอ้ ใช่ ฉันแค่สับสนระหว่างไมโครกับมิลลิ ???? ไม่ว่าจะด้วยวิธีใดก็ตาม เพื่อหลีกเลี่ยงปัญหาใดๆ ก็ตาม ถึงจะเป็นวิชาที่ยุ่งยากสักหน่อย - person Sebastiaan van den Broek; 05.02.2019