itr*_*tro 6 java datetime date
我有对象的集合Collection basics = periodic.getGeneratedBasic();
当迭代这个集合并获取每个对象并投射它时,我可以提取每个对象的日期.现在,在这一点上,我想查看这个对象的集合,哪一个是小和最大的日期.
有谁知道这是怎么做到的吗?
Date max;
Date min;
for(Object o:basics){
      Basic b = (Basic) o;
      Date temp;
      if(b.State=='U'){
           basicAList.add(ba);
           dateCollection.add(b.firstDateTime);
           temp= ;
           if(b.firstDateTime <)
     }
  }
Krz*_*lny 15
在Java 8中,您可以:
        final Date maxDate = dates.stream()
            .max(Date::compareTo)
            .get();
Ken*_*ent 13
这是一个经典的最小和最大问题.无论您的对象是日期或字符串,还是数字.重要的是它们具有可比性.
排序然后采取最大/分钟
最简单的方法就像其他人的回答一样,使用java内置Sort方法对集合进行排序.然后将第一个和最后一个元素作为最小/最大对象.然而,它将线性时间O(n)问题转化为O(nlgn).如果性能问题不是你正在考虑的问题.你可以跳过阅读我的休息文本.我会赞成@ Quoi的回答.
线性时间的简单方法:
保留两个变量min和max,然后选择集合中的每个元素.与您当前的最小值和最大值进行比较并获得正确的值.直至最后.
线性时间的优化方式
上面的方式很简单,但它带来了更多的比较(2n).我们可以稍微优化一下.与上面相同,你有最小和最大两个变量.在循环中,你采用一对元素而不是单个元素.首先比较一对中的两个元素.把较大的一个与你的max var进行比较,将较小的一个与你的min var进行比较.现在我们只需做3(n/2)比较.
希望能帮助到你
编辑
我认为代码并不难写.正如Quoi建议的那样,如果代码可以完成答案,我会添加它们.
请注意,在示例中我使用了int数组.基本上它与Date对象相同.代码以单元测试方法编写.它看起来很长,因为我试图解释上面这个想法.
@Test
    public void testx() {
        final int size = 300000;
        final int[] array = new int[size];
        final Random random = new Random();
        // fill a huge array for testing
        for (int i = 0; i < array.length; i++) {
            array[i] = random.nextInt();
        }
        int min1 = array[0], max1 = array[1], cmp1 = 0;
        int min2 = array[0], max2 = array[1], cmp2 = 0;
        for (int i = 2; i < array.length; i++) {
            min1 = array[i] < min1 ? array[i] : min1;
            cmp1++;
            max1 = array[i] > max1 ? array[i] : max1;
            cmp1++;
        }
        LOG.debug("linear time to find Max & Min simultaneously");
        LOG.debug("Size: {}", size);
        LOG.debug("Max : {}", max1);
        LOG.debug("Min : {}", min1);
        LOG.debug("Total comparisons : {}", cmp1);
        // optimized linear
        int bigger, smaller;
        final boolean odd = array.length % 2 == 1;
        final int till = odd ? array.length - 1 : array.length;
        for (int i = 2; i < till; i += 2) {
            if (array[i] >= array[i + 1]) {
                bigger = array[i];
                smaller = array[i + 1];
            } else {
                bigger = array[i + 1];
                smaller = array[i];
            }
            cmp2++;
            min2 = smaller < min2 ? smaller : min2;
            cmp2++;
            max2 = bigger > max2 ? bigger : max2;
            cmp2++;
        }
        if (odd) {
            min2 = array[size - 1] < min2 ? array[size - 1] : min2;
            max2 = array[size - 1] > max2 ? array[size - 1] : max2;
        }
        LOG.debug("====================================================");
        LOG.debug("optimized linear time to find Max & Min simultaneously");
        LOG.debug("Size: {}", size);
        LOG.debug("Max : {}", max2);
        LOG.debug("Min : {}", min2);
        LOG.debug("Total comparisons : {}", cmp2);
    }
产量
DEBUG:  linear time to find Max & Min simultaneously
DEBUG:  Size: 300000
DEBUG:  Max : 2147475519
DEBUG:  Min : -2147446732
DEBUG:  Total comparisons : 599996
DEBUG:  ====================================================
DEBUG:  optimized linear time to find Max & Min simultaneously
DEBUG:  Size: 300000
DEBUG:  Max : 2147475519
DEBUG:  Min : -2147446732
DEBUG:  Total comparisons : 449997
Bri*_*new 12
为什么不使用Collections.sort()然后获取第一个/最后一个条目?您可以使用自然排序,也可以指定自己的比较器.
请注意,这将对集合进行就地排序.它不会给你一个新的排序集合.
Date是Comparable,所以你可以比较两个Date使用compareTo():
dateOne.compareTo(dateTwo);
返回:如果参数Date等于此Date,则返回值0; 如果此Date在Date参数之前,则小于0的值; 如果此Date位于Date参数之后,则值大于0.
您也可以Collection使用Collections.sort()(O(n logn))对整体进行排序:
Collections.sort(dateCollection);
或者得到最大值Collections.max()和最小值Collections.min()(均为线性时间O(n)).
| 归档时间: | 
 | 
| 查看次数: | 36383 次 | 
| 最近记录: |