簡體   English   中英

根據 n-gram 的出現頻率按升序對 Map 進行排序

[英]Sort a Map in ascending order based on frequency of occurance of n-grams

我正在嘗試根據頻率按升序對地圖中的 ngram 進行排序,然后在getTopFile()方法中增加rank直到達到max getTop()方法由我的講師完成,它做的事情大致相同,但它使用參數Language lang

我的問題是如何按出現頻率升序對地圖中的 ngram 進行排序?


import java.util.*;

public class Database {
    private Map<Integer, TextEntry> dbFile = new TreeMap<>();

    //Add file- Query
    public void addFile(CharSequence s) {
        System.out.println("in addFile() ");
        int ngram = s.hashCode();
//      Map<Integer, TextEntry> textDb = getTextEntries(ngram);
        Map<Integer, TextEntry> textDb = dbFile;

        int frequency = 1;
        if (textDb.containsKey(ngram)) {
            frequency += textDb.get(ngram).getFrequency();
        }
        textDb.put(ngram, new TextEntry(ngram, frequency));

    }

//  public void resizeFile(int max) {
//      System.out.println("in resizeFile() ");
//      Set<Integer> keys = dbFile.keySet();
//      for (Integer ngram : keys) {
//          Map<Integer, TextEntry> top = getTopFile(max, ngram);
//          dbFile.put(ngram, top);
//      }
//  }

    // Sort Language Map in ascending order
//  public Map<Integer, LanguageEntry> getTop(int max, Language lang) {
//      System.out.println("in getTop() ");
//      Map<Integer, LanguageEntry> temp = new TreeMap<>();
//      List<LanguageEntry> les = new ArrayList<>(db.get(lang).values());
//      Collections.sort(les);
//
//      int rank = 1;
//      for (LanguageEntry le : les) {
//          le.setRank(rank);
//          temp.put(le.getKmer(), le);
//          if (rank == max)
//              break;
//          rank++;
//      }
//      return temp;
//  }

    // Sort Map in ascending order
    public Map<Integer, TextEntry> getTopFile(int max, Integer ngram) {
        System.out.println("in getTopFile() ");
        Map<Integer, TextEntry> temp = new TreeMap<>();
        List<TextEntry> sortedList = dbFile.values()
                .stream()
                .sorted(Comparator.comparing(TextEntry::getFrequency))
                .collect(Collectors.toList());

        int rank = 1;
        for (TextEntry le : sortedList) {
            le.setRank(rank);
            temp.put(le.getKmer(), le);
            if (rank == max)
                break;
            rank++;
        }
        System.out.println(temp);
        return temp;
    }



public class TextEntry implements Comparable<TextEntry>  {
    private int kmer;
    private int frequency;
    private int rank;

    public TextEntry(int kmer, int frequency) {
        super();
        this.kmer = kmer;
        this.frequency = frequency;
    }

    public int getKmer() {
        return kmer;
    }

    public void setKmer(int kmer) {
        this.kmer = kmer;
    }

    public int getFrequency() {
        return frequency;
    }

    public void setFrequency(int frequency) {
        this.frequency = frequency;
    }

    public int getRank() {
        return rank;
    }

    public void setRank(int rank) {
        this.rank = rank;
    }

    public int compareTo(TextEntry next) {
        return - Integer.compare(frequency, next.getFrequency());
    }

    @Override
    public String toString() {
        return "[" + kmer + "/" + frequency + "/" + rank + "]";
    }
}

TreeMap 僅按鍵對元素進行排序。 在您當前的實現中,key 沒有關於頻率的信息,因此無法解決問題。 從技術上講,可以使用 TextEntry 作為鍵。 但它是可變的(它有設置器)並且可以隨時更改而無需重新插入(因此無需重新排序),這會破壞排序。

我建議您只在您真正需要的時間和地點對元素進行排序。

要獲得排序列表:

List<TextEntry> sortedList = dbFile.values()
    .stream()
    .sorted(Comparator.comparing(TextEntry::getFrequency))
    .collect(Collectors.toList());

要找到最大元素:

TextEntry max = dbFile.values()
    .stream()
    .max(Comparator.comparing(TextEntry::getFrequency))
    .get();

暫無
暫無

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

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