2014-11-06 47 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