@@ -313,14 +313,14 @@ impl std::ops::Add<LevelStat> for LevelStat {
313313pub struct RecordStore {
314314 /// music records of current user.
315315 /// Vec<Record> contained music records of different levels.
316- records : HashMap < u16 , Vec < FullRecord > > ,
316+ records : HashMap < u16 , HashMap < u8 , FullRecord > > ,
317317}
318318
319319impl RecordStore {
320320 /// open db file and load all music data to memory
321321 pub fn open ( user : String , path : impl Into < PathBuf > , music_store : & MusicStore ) -> Result < Self > {
322322 let path = path. into ( ) ;
323- let mut records: HashMap < u16 , Vec < FullRecord > > = HashMap :: new ( ) ;
323+ let mut records: HashMap < u16 , HashMap < u8 , FullRecord > > = HashMap :: new ( ) ;
324324 // load data
325325 let mut reader = BufReader :: new ( File :: open ( & path) ?) ;
326326 let mut stream = serde_json:: Deserializer :: from_reader ( & mut reader) . into_iter :: < Record > ( ) ;
@@ -334,12 +334,20 @@ impl RecordStore {
334334 let music = music_store. get_music ( music_record. music_id ) ;
335335 let full_record = FullRecord :: from_record_with_music ( & music_record, music) ;
336336 if let Some ( rec) = records. get_mut ( & full_record. get_music_id ( ) ) {
337- if !rec. iter ( ) . any ( |r| r. level == full_record. get_level ( ) ) {
338- rec. push ( full_record. clone ( ) ) ;
337+ let level = full_record. get_level ( ) ;
338+ if !rec. contains_key ( & level) {
339+ rec. insert ( level, full_record) ;
340+ } else if let Some ( r) = rec. get_mut ( & level) {
341+ // record the best record
342+ if r. get_volforce ( ) < full_record. get_volforce ( ) {
343+ * r = full_record;
344+ }
339345 }
340- rec. sort_by_key ( |r| r. get_level ( ) ) ;
341346 } else {
342- records. insert ( full_record. get_music_id ( ) , vec ! [ full_record. clone( ) ] ) ;
347+ let mut m = HashMap :: new ( ) ;
348+ let id = full_record. get_music_id ( ) ;
349+ m. insert ( full_record. get_level ( ) , full_record) ;
350+ records. insert ( id, m) ;
343351 }
344352 }
345353 }
@@ -357,8 +365,9 @@ impl RecordStore {
357365 . iter ( )
358366 . filter ( |( id, _) | music_id. contains ( & id) )
359367 . map ( |( _, rec) | rec)
360- . collect :: < Vec < & Vec < FullRecord > > > ( )
368+ . collect :: < Vec < & HashMap < u8 , FullRecord > > > ( )
361369 . into_iter ( )
370+ . map ( |map| map. values ( ) . collect :: < Vec < & FullRecord > > ( ) )
362371 . flatten ( )
363372 . collect :: < Vec < & FullRecord > > ( )
364373 }
@@ -369,21 +378,18 @@ impl RecordStore {
369378 . records
370379 . iter ( )
371380 . map ( |( _, rec) | rec)
372- . collect :: < Vec < & Vec < FullRecord > > > ( )
381+ . collect :: < Vec < & HashMap < u8 , FullRecord > > > ( )
373382 . into_iter ( )
383+ . map ( |map| map. values ( ) . collect :: < Vec < & FullRecord > > ( ) )
374384 . flatten ( )
375385 . collect :: < Vec < & FullRecord > > ( ) ;
376386 records. sort_by_key ( |rec| rec. volfoce ) ;
377- let mut res = Vec :: with_capacity ( 50 ) ;
378- let mut count = 0 ;
379- for & rec in records. iter ( ) . rev ( ) {
380- if count == 50 {
381- break ;
382- }
383- res. push ( rec) ;
384- count += 1 ;
385- }
386- res
387+ records
388+ . iter ( )
389+ . rev ( )
390+ . take ( 50 )
391+ . cloned ( )
392+ . collect :: < Vec < & FullRecord > > ( )
387393 }
388394
389395 /// compute the complete volforce
@@ -404,8 +410,9 @@ impl RecordStore {
404410 . records
405411 . iter ( )
406412 . map ( |( _, rec) | rec)
407- . collect :: < Vec < & Vec < FullRecord > > > ( )
413+ . collect :: < Vec < & HashMap < u8 , FullRecord > > > ( )
408414 . into_iter ( )
415+ . map ( |map| map. values ( ) . collect :: < Vec < & FullRecord > > ( ) )
409416 . flatten ( )
410417 . filter ( |r| match level {
411418 Some ( l) => r. get_level ( ) == l,
0 commit comments