2014-11-06 48 views
-1

比方说你有一个名为字段中的特定枚举:如何根据使用Java的枚举以升序排列对象列表?

public enum Field { 
    ALBUM, 
    YEAR, 
    DESCRIPTION 
} 

而且你所谓的音乐

public interface Music { 
    String getAlbum(); 
} 

你实现它这样一个对应的Java接口:

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; 
    } 
} 

Eclipse是在Collections.sort抛出下面的错误(专辑):

Bound mismatch: The generic method sort(List<T>) of type Collections is not applicable for the arguments (List<Music>). The inferred type Music is not a valid substitute for the bounded parameter <T extends Comparable<? super T>> 
+0

试着让MusicComparator定义音乐排序规则。然后使用Collections.sort(专辑,新的MusicComparator()); – 2014-11-06 08:58:38

+0

你认为你的比较方法在做什么?每当你比较相同的Field.ALBUM .. – SMA 2014-11-06 11:42:03

+0

这个问题似乎是题外话,因为“如果你可以提供我一个简单的解决方案,我会很感激它”作为答案的回应说明OP是既不感兴趣学习或加入本网站。 – 2014-11-06 18:06:53

回答

0

你要么需要实现音乐相当或你需要创造条件,实现可比接口为您的音乐类的静态类。

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

+0

我只是用特定的实现重新编辑了我的问题。 – 2014-11-06 10:11:49

0

由于Field您使用作为一种关键是在运行时确定,在这里你最好的选择是使用的Collections.sort版本,需要一个Comparator

然后你就可以创建一个Comparator,给定一个Field,将基于该字段的值的两个Music对象,并用它来对列表进行排序,例如:

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 
     } 
    } 

} 

然后如:

Collections.sort(albums, new MusicFieldComparator(field)); 

可以以类似的方式作为一个字段添加ascendingMusicFieldComparator,并否定基础上上升与下降的什么compare()回报。


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

可能使用getField()潜在简化compare(),但是要想真正利用这一点的告诫是:

  • 你要真正落实getField()正确,返回field.getClass()是不是你想做。我会把这个作为练习留给你。
  • 您需要修改getField()以返回Comparable而不是Object。但是,更可能的是,如果您使用的基本类型如StringInteger等,这只会涉及更改返回类型,因为所有这些类型已经实现了Comparable

所以假设getField()回报Comparable和行为正确,实现变得简单:

... 

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

因为它的立场,不过,随着getField(),上述当前的非工作落实将不会按原样工作。


还检查了official tutorial on object ordering,这是短期的,简单,并且会给你一个良好的基础,从工作。

+0

比较方法的实现是什么样的? – 2014-11-06 08:46:04

+0

@AndrePerez我希望你能通过自己的努力学习一些东西!我已经添加了一个基本的例子。一般来说,请参阅“Comparator.compare”的文档;如果'm1 m2'则返回正值,并且您有权决定如何实际执行这些比较。 – 2014-11-06 08:49:10

+0

@AndrePerez顺便说一下;我完全忽略了你的'getField()',这大大简化了'compare'。对不起,已经很晚了。我会更新答案,但有一些注意事项。 – 2014-11-06 08:55:41