首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用Collections.min s.min/max找到多个min/max

使用Collections.min s.min/max找到多个min/max
EN

Stack Overflow用户
提问于 2018-04-02 07:58:39
回答 2查看 894关注 0票数 1

在我正在处理的一个示例中,我试图在列表中找到最小的三个元素(不对列表进行排序),然后将这三个元素添加到一个新的列表中。

因为这是一个示例,我可以简单地使用for循环,使用Collections.min(list)将该元素添加到新列表中,然后从原始列表中删除该元素。如果我没有删除元素,我将得到相同的元素三次。但是,通过删除元素,我得到了我想要的结果。

在不从列表中删除max/min元素的情况下,如何做到这一点?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-04-02 08:08:09

如果您想找到max/min 3元素,我建议您使用PriorityQueue

PriorityQueue<Integer> pq = new PriorityQueue<>(k);

然后在循环中向这个队列添加元素。

然后,您可以将这3个元素添加到列表中,从队列中移除并从方法中返回。

更好的方法是使用3个独立的变量,并在主列表上直接循环。注意:如果您稍后更新3到其他值,则此方法将不可行。而PriorityQueue方法将是灵活的。

代码语言:javascript
运行
复制
public static void main (String[] args) throws java.lang.Exception {
    Integer arr[] = {2, 6, 5, 3, 7, 9, 12, 35, 1, 3};
    List<Integer> incoming = Arrays.asList(arr);
    Comparator<Integer> maxFirstComparator = (x, y) -> Integer.compare(y,x);
    printList(getMinOrMaxKNumbers(incoming, 3, null));
    System.out.println();
    printList(getMinOrMaxKNumbers(incoming, 3, maxFirstComparator));
}

/*
 * gets the max/min K elements from the List
 * @param comparator    if null is passed the method uses natural ordering
 *
 */
private static List<Integer> getMinOrMaxKNumbers(List<Integer> incoming, int k, Comparator<Integer> comparator) {
    int n = incoming.size();
    PriorityQueue<Integer> pq = comparator == null ? new PriorityQueue<>(n) : new PriorityQueue<>(n, comparator);

    for (int i : incoming) {
        pq.add(i);
    }

    List<Integer> outgoing = new ArrayList<>(k);
    for (int i = 0; i < k; i++) {
        outgoing.add(pq.poll());
    }

    return outgoing;
}

private static void printList(List<Integer> list) {
    list.stream().forEach(x -> System.out.print(x + " "));
}
票数 1
EN

Stack Overflow用户

发布于 2018-04-02 09:10:54

我认为使用标准库没有任何直接的方法可以做到这一点。

下面的代码包含一个实用程序方法,用于获取多个最大元素的集合。

它的工作方式是将最大元素保留在TreeSet中,只有当元素属于最大元素时,才会插入元素。树集在这里非常适合,因为它可以快速找到最小元素,并测试集合中是否包含一个元素。

通过这种方式,您可以获得良好的性能,并且可以灵活地使用所需的最大元素数。

代码语言:javascript
运行
复制
public class MultipleMaxElements {
    public static void main(String[] args) {
        List<Integer> l = List.of(4, 2, 5, 8, 2, 8, 0, 1);

        System.out.println(maxElements(l, 3, Comparator.naturalOrder()));
        System.out.println(maxElements(l, 3, Comparator.<Integer>naturalOrder().reversed()));
    }

    public static <T> Set<T> maxElements(Iterable<T> list, int nrElems, Comparator<T> cmp) {
        TreeSet<T> maxSet = new TreeSet<>(cmp);

        for (T elem : list) {
            if (maxSet.size() < nrElems) {
                maxSet.add(elem);
            } else if (!maxSet.contains(elem) && cmp.compare(elem, maxSet.first()) > 0) {
                maxSet.pollFirst();
                maxSet.add(elem);               
            }
        }

        return maxSet;
    }
}

在问题文本中,您没有写任何关于应该如何处理输入列表中的重复元素的内容。该方法返回最大唯一元素。

如果要保留副本,则可以使用基于树的番石榴多集,而不是普通的TreeSet

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49607482

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档