2016-03-14 101 views
1

大家好(如果我的英語不好對不起), 我必須在學校編碼一個Android應用程序。 該項目涉及音樂播放器,我收到了一個音樂數組列表,我希望能夠按照不同標準(藝術家,標題和專輯)進行排序。我已經做了一些代碼,但它只適用於標題。我讓你下面我的代碼,我想按照按鈕修改typeTri,每個按鈕(藝術家,標題和專輯)上有一個clicklistener。感謝您的幫助如何根據不同的標準對數組列表進行排序?

@Override 
    public int compareTo(Musique a){ 
     String typeTri = "Artistes"; 
     if (typeTri.equals("Artistes")){ 

      if (a.getArtiste().compareTo(this.getArtiste())>0) 
       return -1; 
      if (a.getArtiste().compareTo(this.getArtiste())<0) 
       return 1; 
      if (a.getArtiste().equals(this.getArtiste())) 
       return 0; 
     } 

     if (typeTri.equals("Albums")){ 

      if (a.getAlbum().compareTo(this.getAlbum())>0) 
       return -1; 
      if (a.getAlbum().compareTo(this.getAlbum())<0) 
       return 1; 
      if (a.getAlbum().equals(this.getAlbum())) 
       return 0; 
     } 

     if (typeTri.equals("Titres")){ 

      if (a.getTitre().compareTo(this.getTitre())>0) 
       return -1; 
      if (a.getTitre().compareTo(this.getTitre())<0) 
       return 1; 
      if (a.getTitre().equals(this.getTitre())) 
       return 0; 
     } 
    return 0; 
    } 
+0

你可以打電話給'return a.getArtiste()。compareTo(this.getArtiste());';這三種情況沒有必要。如果你想要倒序,只需交換'a'和'this'即可。 –

+0

是的,但我希望能夠按照屏幕上按下的按鈕按藝術家,專輯和標題進行排序。 這裏我按藝術家排序,我想知道如何根據按鈕修改typeTri –

+0

在這種情況下,您需要刪除'equals'情況,因爲您的'compareTo'實現一致(並且對於如果它不大或更小,它是相等的。因此,它將始終從其中一個條件分支返回。另外,如果沒有'typeTri'在執行中改變它的值,你永遠無法通過多個屬性進行比較。 –

回答

3

它看起來在你的代碼像您這樣的Musique實現Comparable<Musique>。參考該類的Javadoc:

此接口對每個實現它的類的對象施加全部排序。這種排序被稱爲該類的自然排序...

如果要根據上下文按不同標準對事物進行排序,則不會按自然順序排序它們。因此,在這種情況下使用Comparable並不合適,而是要定義外部Comparator

這將是最容易有多個實例的Comparator<Musique>,每一個當前的typeTri值:

enum MusiqueComparator implements Comparator<Musique> { 
    ARTISTE { 
    @Override public int compare(Musique a, Musique b) { 
     return b.getArtiste().compareTo(a.getArtiste()); 
    } 
    }, 
    ALBUM { 
    @Override public int compare(Musique a, Musique b) { 
     return b.getAlbum().compareTo(a.getAlbum()); 
    } 
    }, 
    TITRE { 
    @Override public int compare(Musique a, Musique b) { 
     return b.getTitre().compareTo(a.getTitre()); 
    } 
    } 
} 

現在,當您單擊按鈕排序依據,例如藝術家,通過MusiqueComparator.ARTISTECollections.sort按照該標準對您的列表進行排序。

+0

謝謝,我會試試這個! –

+0

它告訴我,集合中的排序不能應用於MusiqueComparator –

+0

您作爲第一個參數傳入的列表是什麼?這是一個列表嗎? –

1

在你onClickListener試試這個

if(musiqueList!=null) { 
      Collections.sort(musiqueList, new Comparator<Musique>() { 
       @Override 
       public int compare(Musique item1, Musique item2) { 
        if(typeTri.equals("Titres"){ 
         //compare your items by Titres 
        } else if(typeTri.equals("Albums") 
         //compare your items by Albums 
        else //compare your items by Artistes 
       } 
      }); 
     } 
1

您可以輕鬆地排序任何的集合(list <>是一個Collection)使用以下功能:

Collections.sort(arrayListToSort, new MyComparator()); 

您需要提供自己的邏輯llike這種比較:

class MyComparator implements Comparator<YourType> 

{

@Override 
public int compare(YourType lhs, YourType rhs) 
{ 
    //your logic for comparing these two, you need to return int, 0 if they're equal, negative value if lhs is greater, positive if it's smaller 
} 

}

相關問題