gpt4 book ai didi

java - 根据 n 元语法的出现频率对 Map 进行升序排序

转载 作者:行者123 更新时间:2023-12-01 19:05:56 27 4
gpt4 key购买 nike

我试图根据频率对 map 中的 ngram 进行升序排序,然后递增 rank直到达到 max ,在方法getTopFile()中。getTop()方法是由我的讲师完成的,它做的事情大致相同,但它使用参数 Language lang

我的问题是如何按出现频率对 map 中的 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 作为键。但它是可变的(它有 setter )并且可以随时更改而无需重新插入(因此无需重新排序),这会破坏排序。

我建议您仅在真正需要的时间和地点对元素进行排序。

要获取排序列表:

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();

关于java - 根据 n 元语法的出现频率对 Map 进行升序排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59556248/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com