Java使用启示比较器对列表进行排序

Java使用启示比较器对列表进行排序,java,arrays,sorting,comparator,Java,Arrays,Sorting,Comparator,我正试图按照与标准列表相对应的启示对音乐列表进行排序 public class Music implements Comparable<CriteriaList> { private String genre, artist, album, titre, price, note; // getters, setters public int compareTo(CriteriaList list) { boolean title, album

我正试图按照与标准列表相对应的启示对音乐列表进行排序

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));
    }
}
公共音乐课{
私人弦乐流派,艺术家,专辑,标题,价格,注释;
//能手,二传手
公共整数比较(标准列表){
布尔标题、专辑、流派、艺术家、注释;
title=!list.getTitle().isEmpty()&&this.getTitle().equals(list.getTitle());
相册=!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());
注意=!list.getNote().isEmpty()&&(Integer.parseInt(this.getNote())>=Integer.parseInt(list.getNote());
返回((标题1:0)+(专辑1:0)+(流派1:0)+(艺术家1:0)+(注1:0));
}
}
My function compare返回与条件列表匹配的字段数,并测试输入是否为空

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;
    }
}
公共类MusicProvider扩展代理{
公共列表getMusicsByCL(标准列表){
ArrayList res=新的ArrayList();
int[]relvanceTab=新int[res.size()];
int i=0,启示录;
用于(音乐:musicListAvailable){
狂欢=音乐。比较(列表);
如果(启示>1){
res.add(音乐);
启示选项卡[++i]=启示;
}
}
//使用RevendanceTab对res进行排序
返回res;
}
}

在这里,我想检索最小启示为1的音乐,并按启示对它们进行排序。如何才能做到这一点?

Comparable用于将两个音乐实例相互比较。如果要与外部实体进行比较,请使用Comparator实现并将其传递给。比较器需要使用CriteriaList初始化,如果第一个元素的排名较高,compare方法将返回正数;如果第二个元素的排名较高,则返回负数;如果它们相等,则返回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));
    }
}
import java.util.Comparator;
公共类MusicComparator实现了Comparator{
私人最终标准清单标准;
公共音乐比较师(标准列表标准){
本标准=标准;
}
@凌驾
公共整数比较(音乐o1,音乐o2){
返回分数(o1)-分数(o2);
}
私人int乐谱(音乐){
布尔标题、专辑、流派、艺术家、注释;
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());
返回((标题1:0)+(专辑1:0)+(流派1:0)+(艺术家1:0)+(注1:0));
}
}

顺便说一下,isEmpty()方法不会保护您免受空指针异常的影响。如果允许字段为空,则需要更好的处理方法。

Comparable用于比较两个音乐实例之间的差异。如果要与外部实体进行比较,请使用Comparator实现并将其传递给。比较器需要使用CriteriaList初始化,如果第一个元素的排名较高,compare方法将返回正数;如果第二个元素的排名较高,则返回负数;如果它们相等,则返回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));
    }
}
import java.util.Comparator;
公共类MusicComparator实现了Comparator{
私人最终标准清单标准;
公共音乐比较师(标准列表标准){
本标准=标准;
}
@凌驾
公共整数比较(音乐o1,音乐o2){
返回分数(o1)-分数(o2);
}
私人int乐谱(音乐){
布尔标题、专辑、流派、艺术家、注释;
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());
返回((标题1:0)+(专辑1:0)+(流派1:0)+(艺术家1:0)+(注1:0));
}
}

顺便说一下,isEmpty()方法不会保护您免受空指针异常的影响。如果允许字段为空,您将需要更好的方法来处理这些字段。

假设您已经创建了实际计算相关性的功能,我将这样继续

创建一个简单的类来保存音乐和计算出的相关性分数,只需通过标准并存储计算结果

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

然后,我将为您拥有的所有音乐实例评分,将它们存储在一个列表中,并执行一个非常简单的
compareTo()
实现,该实现简单地比较每个
ScoredMusic
实例之间的
相关性核心
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;
}