[英]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.