如何使用Java根据枚举按升序对对象列表进行排序?

如何使用Java根据枚举按升序对对象列表进行排序?,java,collections,enums,Java,Collections,Enums,假设您有一个名为Field的特定枚举: public enum Field { ALBUM, YEAR, DESCRIPTION } 您有一个相应的Java接口,名为Music public interface Music { String getAlbum(); } 您可以这样实现它: public class MusicImpl implements Music { public String getAlbum() { return

假设您有一个名为Field的特定枚举:

public enum Field {
    ALBUM,
    YEAR,
    DESCRIPTION
}
您有一个相应的Java接口,名为Music

public interface Music {
    String getAlbum();
}
您可以这样实现它:

public class MusicImpl implements Music {
    public String getAlbum() {
        return this.getField(Field.ALBUM)
    }

    @Override
    public Object getField(Field field) {
        Object myObject = field.getClass();
        return myObject;
    }
}
如何使用字段对其进行排序:

public class MusicManager {
    public List<Music> sortAlbums(Field field, boolean ascending) {
        List<Music> albums = new ArrayList<Music>();
        Music music = new MusciImpl();
        if (ascending = true)
            albums.add(music);
            Collections.sort(albums);
        }
        return albums;
    }
}
公共类MusicManager{
公共列表排序(字段,布尔升序){
列表相册=新建ArrayList();
音乐=新肌肉模型();
如果(升序=真)
专辑。添加(音乐);
收藏。分类(相册);
}
归还相册;
}
}
Eclipse在Collections.sort(albums)上引发以下错误:


绑定不匹配:类型集合的泛型方法排序(列表)不适用于参数(列表)。推断的类型Music不能有效地替代有界参数。您可能需要在Music上实现Comparable,或者需要创建一个静态类,该类将为您的Music类实现Comparable接口


确保您已有可用的排序条件。这些主要基于您的案例中缺少的数据字段。因此,在您的情况下,因为您只有一个枚举字段,所以对列表进行排序是没有意义的。

因为您用作排序键的
字段是在运行时确定的,因此,您最好的选择是使用带有

然后,您可以创建一个
比较器
,该比较器给定一个
字段
,根据该字段的值比较两个
音乐
对象,并使用该字段对列表进行排序,例如:

public class MusicFieldComparator implements Comparator<Music> { 

    private final Field field;

    public MusicFieldComparator (Field f) {
        field = f;
    }

    @Override  
    public int compare (Music m1, Music m2) {
        // ... return result based on `field` values, for example:
        switch (field) {
        case Field.ALBUM:
            return m1.getAlbum().compareTo(m2.getAlbum()); // not null-safe! up to you.
        // ... and so on, for other fields
        }
    }

}
您可以以类似的方式将
升序
作为一个字段添加到
MusicFieldComparator
中,并根据升序与降序对
compare()
返回的内容求反


您会注意到,在上面的示例中,我直接使用了
getAlbum()
。我这样做的原因是,因为我很累,跳过了你的
Music.getField()

您可以使用
getField()
来简化
compare()
,但要真正利用这一点,需要注意以下几点:

  • 您需要实际正确地实现
    getField()
    ,返回
    field.getClass()
    不是您想要做的。我把这个作为练习留给你
  • 您需要修改
    getField()
    以返回一个
    可比较的
    ,而不是
    对象。但是,更可能的情况是,特别是如果您使用的是基本类型,如
    String
    Integer
    等,这只需要更改返回类型,因为所有这些类型都已经实现了
    Comparable
因此,假设
getField()
返回一个
compariable
,并且行为正确,那么实现就变得非常简单:

... 

@Override  
public int compare (Music m1, Music m2) {
    return m1.getField(field).compareTo(m2.getField(field)); // not null-safe!
}
但是,就目前的情况而言,对于当前的非工作实现
getField()
,上述功能将无法正常工作



另外,请查看,它简短、简单,将为您提供一个良好的工作基础。

比较方法的实现是什么样子的?@AndrePerez我希望您能通过自己解决它来学到一些东西!我添加了一个基本示例。一般来说,比较器参见文档;如果
m1
,则返回负数;如果相等,则返回0;如果
m1>m2
,则返回正数;您完全有权决定如何实际进行这些比较。@AndrePerez,顺便说一下;我完全忽略了您的
getField()
,这大大简化了
比较
。对不起,太晚了。我会更新答案,尽管有一些警告。如果你能给我提供一个简单的解决方案,我将不胜感激。@AndrePerez以上是一个简单的答案。做你自己的工作。您拥有所需的一切,如果无法扩展示例,请阅读一些Java教程,直到可以。我们已经尽力免费帮助你了,现在请尽最小的努力帮助你自己。不要成为一个,我们不希望你在这里。试着做一个音乐比较来定义音乐分类的规则。然后使用Collections.sort(相册、新音乐比较器());你认为你的比较方法在做什么?每次你比较同一个Field.ALBUM..时,这个问题似乎偏离主题,因为回答回答“如果你能为我提供一个简单的解决方案,我将不胜感激”说明OP既不想学习也不想添加到此网站。此外,你完全改变了你的问题。不要那样做。如果要验证代码是否正确,请对其进行测试。我已将您的编辑还原为原始问题,以免使下面的答案无效。如果你有一个新问题,问一个新问题。
Collections.sort(albums, new MusicFieldComparator(field));
... 

@Override  
public int compare (Music m1, Music m2) {
    return m1.getField(field).compareTo(m2.getField(field)); // not null-safe!
}