如何使用Java根据枚举按升序对对象列表进行排序?
假设您有一个名为Field的特定枚举:如何使用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
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!
}