2015-04-16 169 views
1

我試圖按照標準列表對應的revelance對音樂列表進行排序。Java用revelance比較器排序列表

public class Music implements Comparable<CriteriaList> { 
    private String genre, artist, album, titre, price, note; 
    // getters, setters 
    public int compareTo(CriteriaList list) { 
     boolean title, album, genre, artist, note; 
     title = !list.getTitle().isEmpty() && this.getTitre().equals(list.getTitle()); 
     album = !list.getAlbum().isEmpty() && this.getAlbum().equals(list.getAlbum()); 
     genre = !list.getGenre().isEmpty() && this.getGenre().equals(list.getGenre()); 
     artist = !list.getArtist().isEmpty() && this.getArtist().equals(list.getArtist()); 
     note = !list.getNote().isEmpty() && (Integer.parseInt(this.getNote()) >= Integer.parseInt(list.getNote())); 
     return ((title ? 1 : 0) + (album ? 1 : 0) + (genre ? 1 : 0) + (artist ? 1 : 0) + (note ? 1 : 0)); 
    } 
} 

我的功能的CompareTo返回,如果輸入不爲空匹配的標準列表,並測試其字段數。

public class MusicProvider extends Agent { 
    public List<Music> getMusicsByCL(CriteriaList list) { 
     ArrayList<Music> res = new ArrayList<Music>(); 
     int[] revelanceTab = new int[res.size()]; 
     int i = 0, revelance; 
     for (Music music : musicListAvailable) { 
      revelance = music.compareTo(list); 
      if (revelance > 1) { 
       res.add(music); 
       revelanceTab[++i] = revelance; 
      } 
     } 
     // sort res with revelanceTab 
     return res; 
    } 
} 

在這裏,我想檢索與最小的revelance 1音樂和按照revelance排序他們。我怎樣才能做到這一點 ?

回答

4

假設您已經創建了實際計算相關性的功能,我會繼續這樣做。

創建一個簡單的類來保存音樂和計算的相關性分數,只需傳入Criteria並存儲計算結果即可。

public class ScoredMusic { 
    private int relevanceScore; 
    public ScoredMusic(Music m) { ... } 
    public void calculateRelevance(Criteria criteria) { ... } 
    public Music getMusic() { ... } 
    public int getRelevanceScore() { ... } 
} 

然後我就進球你的所有音樂的情況下,將它們存儲在一個列表中,並做一個非常簡單的實現compareTo(),僅僅每個ScoredMusic實例之間的relevanceScore進行比較。

1

可比較用於比較兩個音樂對彼此的實例。如果您想與外部實體進行比較,請使用比較器實現並將其傳遞給Collections.sort(List, Comparator)。比較器需要使用CriteriaList進行初始化,如果第一個元素排名較高,比較方法會返回一個正數,如果第二個元素應該排名較高,比較方法會返回負數,如果它們相等,則返回0。 在你的例子中,你將使用你的compareTo方法,並從第一個中減去第二個元素的分數並返回。

事情是這樣的:

import java.util.Comparator; 

public class MusicComparator implements Comparator<Music> { 

    private final CriteriaList criteria; 

    public MusicComparator(CriteriaList criteria) { 
     this.criteria = criteria; 
    } 
    @Override 
    public int compare(Music o1, Music o2) { 
     return score(o1) - score(o2); 
    } 

    private int score(Music music) { 
     boolean title, album, genre, artist, note; 
     title = criteria.getTitle().isEmpty() || criteria.getTitle().equals(music.getTitle()); 
     album = criteria.getAlbum().isEmpty() || criteria.getAlbum().equals(music.getAlbum()); 
     genre = criteria.getGenre().isEmpty() || criteria.getGenre().equals(music.getGenre()); 
     artist = criteria.getArtist().isEmpty() || criteria.getArtist().equals(music.getArtist()); 
     note = criteria.getNote().isEmpty() || (!music.getNote().isEmpty() && Integer.parseInt(music.getNote()) >= Integer.parseInt(criteria.getNote())); 
     return ((title ? 1 : 0) + (album ? 1 : 0) + (genre ? 1 : 0) + (artist ? 1 : 0) + (note ? 1 : 0)); 
    } 
} 

順便說一句,在的isEmpty()方法將不會保護你的空指針異常。如果允許字段爲空,則需要更好的方法來處理這些字段。

+0

不錯!我會試試這個! Thx :) – melkir

+0

我可以爲每個字段添加null!= criteria.getTitle()&&!criteria.getTitle()。isEmpty()以保護我的函數免受空指針exc影響。 – melkir

+0

另一個選擇是導入一個StringUtils類。他們通常會提供一個isEmpty或isBlank方法,您可以將其傳遞給您的字段。根據您想要如何處理空值和空白字符串(如果您想以不同的方式處理它們),有很多選項可供選擇。導入這些軟件包需要一些開銷,但它們提供了許多有用的功能。 Apache Commons和Google Guava是這些類型輔助函數的好起點。 – BamaPookie

0

這是我的最後一節課,

public class ScoredMusic implements Comparable<ScoredMusic> { 
    private int revelanceScore = 0; 
    private Music music; 

    public ScoredMusic(Music music, CriteriaList crit) { 
     this.music = music; 
     calculateRevelance(crit); 
    } 

    private void calculateRevelance(CriteriaList list) { 
     boolean title, album, genre, artist, note; 
     title = !list.getTitle().isEmpty() && music.getTitre().equals(list.getTitle()); 
     album = !list.getAlbum().isEmpty() && music.getAlbum().equals(list.getAlbum()); 
     genre = !list.getGenre().isEmpty() && music.getGenre().equals(list.getGenre()); 
     artist = !list.getArtist().isEmpty() && music.getArtist().equals(list.getArtist()); 
     note = !list.getNote().isEmpty() && (Integer.parseInt(music.getNote()) >= Integer.parseInt(list.getNote())); 
     revelanceScore = ((title ? 1 : 0) + (album ? 1 : 0) + (genre ? 1 : 0) + (artist ? 1 : 0) + (note ? 1 : 0)); 
    } 

    public Music getMusic() { 
     return music; 
    } 

    public int getRevelanceScore() { 
     return revelanceScore; 
    } 

    public int compareTo(ScoredMusic other) { 
     return Integer.compare(this.getRevelanceScore(), other.getRevelanceScore()); 
    } 
} 

,並在我的第二類

public List<ScoredMusic> getMusicsScoredByCL(CriteriaList list) { 
    ArrayList<ScoredMusic> scoredMusics = new ArrayList<ScoredMusic>(); 
    ScoredMusic sc; 
    for (Music music : musicListAvailable) { 
     sc = new ScoredMusic(music, list); 
     scoredMusics.add(sc); 
    } 
    // sort by revelance and descending order 
    Collections.sort(scoredMusics, Collections.reverseOrder()); 
    return scoredMusics; 
}