2016-03-14 48 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 
} 

}

相关问题