[英]Sorting a list of triples within a map using one of the values of the triple
我有一個像這樣的三元組的哈希圖:
HashMap<String, List<Triplet<String,Integer,Integer>>> output = new HashMap<String, List<Triplet<String,Integer,Integer>>>();
其中鍵是文件名,三元組包含單詞的信息及其頻率信息(tf 和 df)。例如
{File1 = {coffee,23,1},{caffeine,12,2},{brew,9,1}; File2 = {}.......}
我想根據三元組的第二個值,即 tf(詞頻)對這個三元組列表的值進行排序。
for (Entry<String, List<Triplet<String, Integer, Integer>>> entry : output.entrySet()) {
String key = entry.getKey();
List<Triplet<String, Integer, Integer>> value = entry.getValue();
接下來會發生什么?
這是三胞胎的樣子:
public class Triplet<T, U, V> {
private final T first;
private final U second;
private final V third;
public Triplet(T first, U second, V third) {
this.first = first;
this.second = second;
this.third = third;
}
public T getFirst() {
return first;
}
public U getSecond() {
return second;
}
public V getThird() {
return third;
}
}
任何幫助,指導將不勝感激。
我想到了兩種方法:
讓你的Triplet
Comparable
寫一個Comparator
比您可以對 List 進行排序或使用例如TreeSet
如果你不能通過在它上面實現Comparable
來改變你的Triplet
類,這將是一個解決方案,使用Collections.sort
方法:
for (Entry<String, List<Triplet<String, Integer, Integer>>> entry : output.entrySet()) {
String key = entry.getKey();
List<Triplet<String, Integer, Integer>> value = entry.getValue();
// This sorts the list using the anonymous instantiated Comparator class
Collections.sort(value, new Comparator<Triplet<String, Integer, Integer>>(){
@Override
public int compare(Triplet<String, Integer, Integer> object1, Triplet<String, Integer, Integer> object2) {
return object1.getSecond().compareTo(object2.getSecond());
}
});
或者,以更通用的方式,不使用硬類型:
Collections.sort(value, new Comparator<Triplet>(){
@Override
public int compare(Triplet object1, Triplet object2) {
return object1.getSecond().compareTo(object2.getSecond());
}
});
那這個呢?
public class Triplet<T, U, V> implements Comparable<Triplet<T, U, V> > {
private final T first;
private final U second;
private final V third;
public Triplet(T first, U second, V third) {
this.first = first;
this.second = second;
this.third = third;
}
public T getFirst() {
return first;
}
public U getSecond() {
return second;
}
public V getThird() {
return third;
}
public int compareTo(Triplet<T, U, V> comparetrpl) {
T a = comparetrpl.getFirst();
//ascending order
return (this.first > a) ? 1 : 0;
//descending order
//return (a > this.first) ? 1 : 0;
}
}
以及使用sort
方法?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.