如何根据列表中元素出现的频率安排列表中元素的顺序是一个好的方法(包括重复元素).
我需要使用列表中出现频率最高的前5个项。
我考虑使用HashMap来计算元素的频率,每次元素出现时增加相应的计数器,然后进行5次HashMap迭代,以找到每次迭代中最高频率的元素。
如何根据列表中元素出现的频率安排列表中元素的顺序是一个好的方法(包括重复元素).
我需要使用列表中出现频率最高的前5个项。
我考虑使用HashMap来计算元素的频率,每次元素出现时增加相应的计数器,然后进行5次HashMap迭代,以找到每次迭代中最高频率的元素。
public static Map <Foo,Integer>;
class Foo implements Comparator<Foo>{
private Bar element;
public int compare(Foo f1, Foo f2){
return SomeClass.map.get(f1) - SomeClass.map.get(f2);
}
}
只需使用list
中的更新来更新地图。
使用addFooToList()
,removeFooFromList()
强制包装对列表的访问,并在其中封装地图更新逻辑。
Multiset
,并按频率排序。
Multiset<Integer> set = HashMultiset.create();
int amount = 10000000;
Random random = new Random();
for (int i = 0; i < amount; i++) {
set.add(Integer.valueOf(random.nextInt(255)));
}
TreeSet<Entry<Integer>> sortedEntries = Sets.newTreeSet(
new Comparator<Entry<Integer>>() {
public int compare(Entry<Integer> a, Entry<Integer> b) {
return Ints.compare(a.getCount(), b.getCount());
}
});
Iterables.addAll(sortedEntries, set.entrySet());
for (Entry<Integer> entry : Iterables.limit(sortedEntries, 5)) {
System.out.println(entry.getElement());
}
我也会使用HashMap。我找到了一些代码,就是这样做的:
HashMap<String, Integer> counts = new HashMap<String, Integer>();
void increment(String s) {
Integer oldCount = counts.get(s);
if (oldCount == null) {
counts.put(s, 1);
} else {
counts.put(s, oldCount + 1);
}
}
列出元素:
Map.Entry<String, Integer>[] array = new Map.Entry[counts.size()];
counts.entrySet().toArray(array);
Arrays.sort(array, new Comparator<Map.Entry<String, Integer>>() {
public int compare(Map.Entry<String, Integer> a, Map.Entry<String, Integer> b) {
return b.getValue() - a.getValue();
}
});
int x = 0, min = 0;
for (Map.Entry<String, Integer> el : array) {
String k = el.getKey();
println("Count: " + el.getValue() + "\n" + k + "\n\n");
}