2015-04-16 112 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; 
}