Java 如何根据不同的标准对数组列表进行排序?
大家好(如果我的英语不好,对不起), 我必须在学校编写一个Android应用程序。 该项目涉及到一个音乐播放器,我得到了一个音乐阵列列表,我希望能够按照不同的标准(艺术家、标题和专辑)对它们进行排序。我已经做了一些代码,但它只适用于标题。下面是我的代码,我想根据按下的按钮修改typeTri,每个按钮上都有一个clicklistener(艺术家、标题和专辑)。谢谢你的帮助Java 如何根据不同的标准对数组列表进行排序?,java,sorting,arraylist,Java,Sorting,Arraylist,大家好(如果我的英语不好,对不起), 我必须在学校编写一个Android应用程序。 该项目涉及到一个音乐播放器,我得到了一个音乐阵列列表,我希望能够按照不同的标准(艺术家、标题和专辑)对它们进行排序。我已经做了一些代码,但它只适用于标题。下面是我的代码,我想根据按下的按钮修改typeTri,每个按钮上都有一个clicklistener(艺术家、标题和专辑)。谢谢你的帮助 @Override public int compareTo(Musique a){ String t
@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;
}
@覆盖
公共国际比较(音乐a){
String typeTri=“艺人”;
if(类型三等于(“艺人”)){
如果(a.getArtiste().compareTo(this.getArtiste())>0)
返回-1;
if(a.getArtiste().compareTo(this.getArtiste())0)
返回-1;
如果(a.getAlbum().compareTo(this.getAlbum())0)
返回-1;
如果在onclick侦听器中(a.getitre().compareTo)(this.getitre()),请尝试以下操作
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
}
});
}
if(musiqueList!=null){
Collections.sort(musiqueList,newcomparator(){
@凌驾
公共整数比较(音乐项目1、音乐项目2){
如果(类型三等于(“滴定度”){
//按标题比较你的物品
}else if(typeTri.equals(“相册”)
//按相册比较您的项目
else//请艺术家比较您的物品
}
});
}
在你的onclick监听器中试试这个
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
}
});
}
if(musiqueList!=null){
Collections.sort(musiqueList,newcomparator(){
@凌驾
公共整数比较(音乐项目1、音乐项目2){
如果(类型三等于(“滴定度”){
//按标题比较你的物品
}else if(typeTri.equals(“相册”)
//按相册比较您的项目
else//请艺术家比较您的物品
}
});
}
在您的代码中,看起来您正在制作Musique
实现可比较的。参考该类的Javadoc:
此接口对实现它的每个类的对象施加总排序。此排序称为类的自然排序
如果您想根据上下文按不同的标准对事物进行排序,那么您不是按自然顺序对它们进行排序。因此,在这种情况下,不适合使用Comparable
,而是定义外部比较器
最简单的方法是拥有多个比较器
实例,每个实例对应一个当前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());
}
}
}
enum MusiqueComparator实现Comparator{
艺人{
@覆盖公共整数比较(Musique a、Musique b){
返回b.getArtiste().compareTo(a.getArtiste());
}
},
相册{
@覆盖公共整数比较(Musique a、Musique b){
返回b.getAlbum().compareTo(a.getAlbum());
}
},
乳头{
@覆盖公共整数比较(Musique a、Musique b){
返回b.getitre().compareTo(a.getitre());
}
}
}
现在,当您单击按钮进行排序时,例如艺术家,将MusiqueComparator.Artister
传递到,以按照该标准对列表进行排序。在您的代码中,看起来您正在制作Musique
实现可比性
。参考该类的Javadoc:
此接口对实现它的每个类的对象施加总排序。此排序称为类的自然排序
如果您想根据上下文按不同的标准对事物进行排序,那么您不是按自然顺序对它们进行排序。因此,在这种情况下,不适合使用Comparable
,而是定义外部比较器
最简单的方法是拥有多个比较器
实例,每个实例对应一个当前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());
}
}
}
enum MusiqueComparator实现Comparator{
艺人{
@覆盖公共整数比较(Musique a、Musique b){
返回b.getArtiste().compareTo(a.getArtiste());
}
},
相册{
@覆盖公共整数比较(Musique a、Musique b){
返回b.getAlbum().compareTo(a.getAlbum());
}
},
乳头{
@覆盖公共整数比较(Musique a、Musique b){
返回b.getitre().compareTo(a.getitre());
}
}
}
现在,当您单击按钮进行排序时,例如艺术家,请将MusiqueComparator.ARTISTE
传递到以该标准对列表进行排序。您可以使用以下功能轻松对任何集合(列表即集合)进行排序:
Collections.sort(arrayListToSort, new MyComparator());
您需要提供自己的逻辑来进行比较,如下所示:
class MyComparator implements Comparator<YourType>
}您可以使用以下功能轻松对任何集合(列表是集合)进行排序:
Collections.sort(arrayListToSort, new MyComparator());
您需要提供自己的逻辑来进行比较,如下所示:
class MyComparator implements Comparator<YourType>
}您可以调用,例如返回a.getArtiste().compareTo(this.getArtiste())
;不需要这三种情况。如果你想颠倒顺序,只需交换a
和这个
。是的,但我想能够根据屏幕上按下的按钮按艺术家、相册和标题进行排序。在这里,我在任何情况下都会按艺术家进行排序,我想知道如何根据c中按下的按钮修改typeTri在这种情况下,您需要删除equals
的情况,因为如果比较器的实现是一致的(对于字符串
,则是一致的)如果它不大于或小于,则等于。因此,它将始终从一个条件分支返回。此外,如果不在执行过程中更改其值,则不能通过多个属性进行比较。typeTri
。因此,我认为使用compareTo不是一个解决方案。你知道如何使用其他方法实现吗?你可以