簡體   English   中英

Java使用啟示比較器對列表進行排序

[英]Java sort a list with revelance 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, 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;
    }
}

在這里,我要檢索最小啟示度為1的音樂,並按啟示性對它們進行排序。 我怎樣才能做到這一點 ?

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

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

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

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

Comparable用於比較Music的兩個實例。 如果要與外部實體進行比較,請使用Comparator實現並將其傳遞給Collections.sort(List,Comparator) 比較器將需要使用CriteriaList進行初始化,如果第一個元素的排名較高,則compare方法將返回正數;如果第二個元素的排名較高,則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));
    }
}

順便說一句,isEmpty()方法不會保護您免受空指針異常的影響。 如果允許字段為空,則將需要一種更好的方法來處理這些字段。

這是我的最后一堂課

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM