2016-12-20 7 views
0

私は音楽リストについて約2000件のレコードを持っています。 言って、各音楽オブジェクトはコンパイラによってJava Collection.sort(mList、comparator)に時間がかかります

Collections.sort(mList, new MySongEntry.TitleComparator()); 

をプロファイリング空の曲のタイトル/アーティスト、特殊文字、またはロケール

ようTitle

public static class TitleComparator implements Comparator<MySongEntry> { 
    @Override 
    public int compare(MySongEntry e1, MySongEntry e2) { 
     return e1.getTitle().compareToIgnoreCase(e2.getTitle()); 
    } 
} 

public static class ArtistComparator implements Comparator<MySongEntry> { 
    @Override 
    public int compare(MySongEntry e1, MySongEntry e2) { 
     return e1.getArtist().compareToIgnoreCase(e2.getArtist()); 
    } 
} 

無視してくださいArtistコーナーケースを約130かかり含まれています〜150ms、

しかし

Collections.sort(mList, new MySongEntry.ArtistComparator()); 

いまいましい 600〜1500msをとります。

私は本当に理由を考えることができません。タイトルとアーティストの両方がStringタイプです。長さは異なります。また、これらのコンパレータをインスタンス化すると、無関係な時間がかかりました(< 0ms)

誰でも同じような経験がありますか?

Btw、これはAndroid版です。

+2

あなたのmListはすでにほとんどのタイトルでソートされていますか?最初のソートにはほとんど手間がありませんでしたが、2番目のソートには多くのことがあります。 – leeyuiwah

+0

@leeyuwahおそらく。それは理由だけかもしれません。私はそれをランダムに混ぜて、より良いプロファイリングを得ることができるかどうかを見ていきます。 –

+0

@PhilippClaßen確かにそれはそれらではありません。私はこれをロジックに分離するようにしました。 –

答えて

2

だから、@leeyuiwahは私のコメントで正しいです。

私はCollections.sort(..)を呼び出して、今、彼らの両方が同様の時間を持っている右の前に

long seed = System.nanoTime(); 
Collections.shuffle(mList, new Random(seed)); 

を追加しました。

最初にmListをどのように配置したのかは、ソートメカニズムに直接影響を与えました。私が検討しているはずです

一つのこと:/

スレッドを閉じました。皆さん、ありがとうございました。

3

私の推測では、それはデータ自体の性質だと思います。

あなたのデータには、タイトルで並べ替えるときの比較は少ないかもしれませんが、著者の場合はちょっとだけあります。これは、タイトルがよりユニークであるためです。

2つの合理的に同一の文字列がある場合は、文字列ごとに文字列を比較して、1つ以上の文字列を他の文字列よりも大きく(または等しい)とみなします。

したがって、同じ文字列がたくさんある場合、「 - 」がランダムな一意の文字である10文字列「AA-」とすると、「-AA」があった場合と比較して、文字列全体を走査するのではなく、それが大きいかどうかを直ちに判断できます)。

+1

ありがとう@Kウェストン。データセットはかなり一般化されています。それは、最初にmListのデータセットがどのように追加されたかに関するものでした。私自身の答えを見てください。素晴らしい一日をお過ごしください –

+1

ああ、もちろん私はこれが有効になることに同意します! –

+0

ああ、それは理にかなっています。素晴らしい答え! –

関連する問題