当前位置: 首页 > 面试题库 >

从主要包含空值的可比对象列表中获取最小值和最大值的最佳方法是什么?

闻人思聪
2023-03-14
问题内容

我在想这样的事情:

public static <T extends Comparable<T>> T minOf(T...ts){        
    SortedSet<T> set = new TreeSet<T>(Arrays.asList(ts));
    return set.first();
}

public static <T extends Comparable<T>> T maxOf(T...ts){
    SortedSet<T> set = new TreeSet<T>(Arrays.asList(ts));
    return set.last();
}

但是也不是null安全的,这也是我想要的。

您知道解决此问题的更好方法吗?

编辑:

评论之后,我还尝试了min():

public static <T extends Comparable<T>> T minOf(T...ts){        
    return Collections.min(Arrays.asList(ts), new Comparator<T>(){

        public int compare(T o1, T o2) {
            if(o1!=null && o2!=null){
                return o1.compareTo(o2);
            }else if(o1!=null){
                return 1;
            }else{
                return -1;  
            }
        }});
}

你对那个怎么想的?


问题答案:

Collections.max有什么问题?

您为什么还要担心无效安全性?您确定要允许null出现在您的收藏夹中吗?



 类似资料:
  • 我有这样的课: 和类似的列表,其中填充了元素。 如何使用Java8获得的最小值和最大值?

  • 我有下面的代码,其中计算最小和最大订单项目从列表并按预期工作。我想知道是否可以进一步重构/改进,使其更优化和高性能地处理数千或订单列表。 我故意不做 Collections.min(itemFrequencyMap.values()) 和 因为它需要对所有值进行两次迭代,然后再次循环遍历 以查找值和的条目。

  • 我有一个存储时间跨度数据的表。该表的架构类似于: 我试图计算出每个记录id的开始和结束日期,即最小开始日期和最大结束日期。StartDate不可为null,所以我不需要担心这个问题,但我需要MAX(EndDate)来表示这是当前正在运行的时间跨度。 重要的是,我要保持EndDate的NULL值,并将其视为最大值。 最简单的尝试(如下)无法突出MIN和MAX将忽略NULLS的问题(来源:http:/

  • 我试图找出在Spark dataframe列中获得最大值的最佳方法。 考虑以下示例: 上面的每一个都给出了正确的答案,但在没有Spark分析工具的情况下,我无法判断哪一个是最好的。 就Spark运行时或资源使用而言,上述哪种方法最有效,或者是否有比上述方法更直接的方法,有任何来自直觉或经验主义的想法?

  • 生成包含位数的最低和最高整数值的最佳方法是什么? 例如: =1:Min=0,Max=9 我觉得这应该是一件非常容易完成的事情,但是我正在努力理解它背后的数学。 以下是迄今为止我得到的生成最大值的方法(基于此答案): 如果有人能帮助生成最小值,或者对上面的代码提出改进建议,我将不胜感激。 编辑 我就快到了——这似乎适用于所有情况,除非=1(最小值预期为0)