从列表中查找最少 3 个值
Finding Minimum 3 values from a list
我正在做一个项目,我需要从 HashMap 中找到至少 3 个三个值。我找到了一个找到最高值的代码。在这里。
public static <K, V extends Comparable<? super V>> List<Entry<K, V>>
findGreatest(Map<K, V> map, int n)
{
Comparator<? super Entry<K, V>> comparator =
new Comparator<Entry<K, V>>()
{
public int compare(Entry<K, V> e0, Entry<K, V> e1)
{
V v0 = e0.getValue();
V v1 = e1.getValue();
return v0.compareTo(v1);
}
};
PriorityQueue<Entry<K, V>> highest =
new PriorityQueue<Entry<K,V>>(n, comparator);
for (java.util.Map.Entry<K, V> entry : map.entrySet())
{
highest.offer(entry);
while (highest.size() > n)
{
highest.poll();
}
}
List<Entry<K, V>> result = new ArrayList<Map.Entry<K,V>>();
while (highest.size() > 0)
{
result.add(highest.poll());
}
return result;
}
如何修改它以找到最小值?
请在这里帮助我。
更新:抱歉我的错误,我正在寻找从 HashMap
中找到最小值
您可以使用 Collections.min(list)
从列表中获取最低值
就个人而言,我会简单地通过 Collections.sort( ... )
对列表进行排序(因为它似乎由 Comparables 组成),然后 return 三个第一个(或最后一个)元素。
除了使用 Collections.reverseOrder(Comparator c).
颠倒 Comparator
的顺序外,您可以使用完全相同的代码
PriorityQueue<Entry<K, V>> highest =
new PriorityQueue<Entry<K,V>>(n, Collections.reverseOrder(comparator));
但是,这不是最有效的方法。一次完成是可能的。
简单的你可以这样试试。您不需要自定义比较器即可实现您在此处尝试的内容。
ArrayList<Integer> list = new ArrayList<Integer>();
list.add(23);
list.add(65);
list.add(85);
list.add(1);
list.add(54);
list.add(5);
Collections.sort(list);
for(int i=0;i<3;i++)
System.out.println(list.get(i));
涉及对地图进行排序的建议的运行时间为 O(n log(n))。以下实现的运行时间为 O(n m),其中 n 是地图的大小,m 是结果的大小,即如果您想要 m 个最小元素。
public static <K, V extends Comparable<? super V>> List<Entry<K, V>> findGreatest(Map<K, V> map, int m)
{
LinkedList<Entry<K, V>> result = new LinkedList<Entry<K, V>>();
for (Entry<K, V> entry : map.entrySet())
{
ListIterator<Entry<K, V>> iterator = result.listIterator();
int i = n;
while (iterator.hasNext() && i-- > 0)
{
if (iterator.next().getValue().compareTo(entry.getValue()) > 0)
{
iterator.previous();
iterator.add(entry);
if (result.size() > n)
{
result.removeLast();
}
break;
}
}
if (result.size() < n)
{
result.add(entry);
}
}
return result;
}
@Jude Niroshan,他的回答也对了一个
如果有帮助,您也可以试试这个,您可以更改值并检查。
LinkedList<Integer> li=new LinkedList<Integer>();
li.add(-8);
li.add(0);
li.add(10);
li.add(-1);
li.add(9);
Collections.sort(li);
for(Integer a:li){
if(a<3)
System.out.println(a);
}
我正在做一个项目,我需要从 HashMap 中找到至少 3 个三个值。我找到了一个找到最高值的代码。在这里。
public static <K, V extends Comparable<? super V>> List<Entry<K, V>>
findGreatest(Map<K, V> map, int n)
{
Comparator<? super Entry<K, V>> comparator =
new Comparator<Entry<K, V>>()
{
public int compare(Entry<K, V> e0, Entry<K, V> e1)
{
V v0 = e0.getValue();
V v1 = e1.getValue();
return v0.compareTo(v1);
}
};
PriorityQueue<Entry<K, V>> highest =
new PriorityQueue<Entry<K,V>>(n, comparator);
for (java.util.Map.Entry<K, V> entry : map.entrySet())
{
highest.offer(entry);
while (highest.size() > n)
{
highest.poll();
}
}
List<Entry<K, V>> result = new ArrayList<Map.Entry<K,V>>();
while (highest.size() > 0)
{
result.add(highest.poll());
}
return result;
}
如何修改它以找到最小值? 请在这里帮助我。 更新:抱歉我的错误,我正在寻找从 HashMap
中找到最小值您可以使用 Collections.min(list)
从列表中获取最低值
就个人而言,我会简单地通过 Collections.sort( ... )
对列表进行排序(因为它似乎由 Comparables 组成),然后 return 三个第一个(或最后一个)元素。
除了使用 Collections.reverseOrder(Comparator c).
颠倒Comparator
的顺序外,您可以使用完全相同的代码
PriorityQueue<Entry<K, V>> highest =
new PriorityQueue<Entry<K,V>>(n, Collections.reverseOrder(comparator));
但是,这不是最有效的方法。一次完成是可能的。
简单的你可以这样试试。您不需要自定义比较器即可实现您在此处尝试的内容。
ArrayList<Integer> list = new ArrayList<Integer>();
list.add(23);
list.add(65);
list.add(85);
list.add(1);
list.add(54);
list.add(5);
Collections.sort(list);
for(int i=0;i<3;i++)
System.out.println(list.get(i));
涉及对地图进行排序的建议的运行时间为 O(n log(n))。以下实现的运行时间为 O(n m),其中 n 是地图的大小,m 是结果的大小,即如果您想要 m 个最小元素。
public static <K, V extends Comparable<? super V>> List<Entry<K, V>> findGreatest(Map<K, V> map, int m)
{
LinkedList<Entry<K, V>> result = new LinkedList<Entry<K, V>>();
for (Entry<K, V> entry : map.entrySet())
{
ListIterator<Entry<K, V>> iterator = result.listIterator();
int i = n;
while (iterator.hasNext() && i-- > 0)
{
if (iterator.next().getValue().compareTo(entry.getValue()) > 0)
{
iterator.previous();
iterator.add(entry);
if (result.size() > n)
{
result.removeLast();
}
break;
}
}
if (result.size() < n)
{
result.add(entry);
}
}
return result;
}
@Jude Niroshan,他的回答也对了一个 如果有帮助,您也可以试试这个,您可以更改值并检查。
LinkedList<Integer> li=new LinkedList<Integer>();
li.add(-8);
li.add(0);
li.add(10);
li.add(-1);
li.add(9);
Collections.sort(li);
for(Integer a:li){
if(a<3)
System.out.println(a);
}